犀牛书笔记(第11章 JavaScript标准库)
集合与映射
Set: Set()构造函数创建集合,参数需要是一个可迭代对象;集合的size字段类似数组的length, 保存集合大小。add: 接收一个参数,如果参数是数组,则不会打平。delete: 删除一个集合元素。集合成员判重是根据===即严格相等。所以数值1和字符串“1”是两个不同的集合元素。has:成员测试。for of 迭代;…打平,都可用于集合。js的集合无索引,但有序(插入顺序)。也有forEach方法,与数组方法类似。
Map:
let m = new Map([
["one", 1],
["two", 2]
])
let p = new Map(Object.entries(o))
get/set/remove/clear/has/size
使用全等性来比较键。按照插入顺序迭代。
WeakSet/WeakMap:
弱引用。


定型数组与二进制数组
定型数组:1. 元素全是数值且允许制定数值类型;2. 创建时指定长度且不再改变;3. 创建时初始化为0.

创建定型数组:调用构造函数并传入元素个数作为参数。定型数组也有工厂方法from()和of(), 二者都类似于Array.from()和Array.of().
ArrayBuffer:
let buffer = new ArrayBuffer(1024*1024)
buffer.byteLength // 1024*1024

所有定型数组底层都有一个ArrayBuffer, 即使没有在构造函数里指定(此时会自动创建)。
使用定型数组:

set方法:以一个数组或定型数组作为第一个参数,以元素偏移量作为可选的第二个参数(默认0)。
subarray方法:与slice方法参数相同,不同点是,slice返回新数组,不共享内存,而subarray只返回相同底层值的一个新视图。

定型数组的字节序:


DataView的get方法,第一个参数是字节偏移量,第二个布尔值指示小端序还是大端序(可选,默认false大端)。set方法,第一个参数是偏移量,第二个参数是值,第三个参数是布尔值(可选,同上)
正则表达式与模式匹配
定义正则:可以用RegExp()构造函数创建,也可以用/ … / 字面量创建。

如果想匹配这些符号的字面值,需要加反斜杠\来转义。
[]方括号:/[abc]/(字符类)匹配a、b、c中的任意一个字母。/[^abc]/(排除性字符类)匹配除abc外的任意字符。/[a-z]/表示匹配任意小写字符。(如果想匹配连字符本身,需要把连字符放到z的后面)


上表中的重复,默认都是贪婪重复,即尽可能多的匹配。也可以在字符后面加个问号,代表非贪婪匹配。例如,/a+/匹配一个或多个a, 在应用到aaa时匹配3个字符。/a+?/应用到aaa时,只匹配第一个a。
正则语法也包含指定任选(|)、分组子表达式和引用前面子表达式的特殊字符。
任选:/ab|cd|ef/匹配字符串ab或cd或ef。在找到匹配项之前,会从左到右依次适配任选模式。找第一个匹配。比如/a|ab/应用到字符串ab, 只会匹配字母a。
分组子表达式:加圆括号,让括号里的模式可以被 |,*,+,? 当做一个整体。
圆括号的另一个用途:定义子模式。当正则表达式成功匹配一个目标字符串后,可以从目标字符串中提取出与圆括号包含的子模式对应的部分。
与子表达式相关的另一个用途是,在同一个则合格南泽表达式里回引子表达式。\1回引第一个子表达式,依次类推。注意,由于子表达式可能嵌套,所以它们的位置按照左括号计算。
/([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/
上面这个正则表达式中,([Ss]cript)要使用\2来引用。引用时,不是引用的模式,是引用文本。引用可以用来强制字符串中不同的部分包含完全相同的字符。例如,如果要求引号匹配,可以使用引用:/(['"])[^'"]*\1/




正则表达式标记:
g: 全局。i: 不区分大小写。m: 多行。^和$ 匹配每一行的开头和结尾。s: . 匹配行终止符。u: unicode,. 匹配完整的码点,而非16位数值。y: sticky。对匹配的影响后面再说了。
模式匹配的字符串方法:
search, 传入一个RegExp对象,返回第一个匹配处的索引。如果都不匹配返回-1. 不支持g标志位。如果传入一个str, 则会调用RegExp构造函数将str转成正则。
replace: 替换。如果第一个参数是str, 不会像search一样转换,而是字面量匹配。支持g即全局替换。替换字符串支持$1, 这样的写法,用于表示第一个匹配分组。也支持命名捕获组。

match: 只有一个参数,就是RegExp对象(字符串会自动转换),返回匹配的数组。支持g选项。没有g选项时,返回的仍然是个数组,只是第一个元素是匹配字符串,后面的元素是各个捕获组。

如果同时设置了g和y, match()返回包含所有匹配字符串的数组,但第一个匹配项必须始于字符串开头,每个后续的匹配项必须从前一个匹配项的后一个字符开始。

matchAll: 接收一个带g标志的正则,返回一个迭代器,迭代所有匹配。也可以设置lastIndex属性,告诉matchAll从字符串中的哪个索引开始匹配。
split: 如果调用split传入RegExp作为分隔符,且这个正则中包含捕获组,则捕获组匹配的文本也会包含在返回的数组中。
RegExp类:构造函数的第一个参数是正则,第二个可选的标志位(g, i, m, s, u, y)。用于动态创建正则表达式,即创建那些无法用正则字面量语法表示的正则。
RegExp的test方法:使用正则表达式的最简单方式。接收一个字符串参数,如果匹配返回true, 不匹配返回false.
exec方法:接收字符串参数,如果匹配返回数组,跟字符串的match方法在非全局搜索时返回的数组一样。如果不匹配返回null.

日期与时间
Date API有个奇怪的地方,即每年第一个月对应数值0,每月第一天对应数值1.
Date对象可以使用</<=/>/>=比较。可以用一个对象减去另一个以确定差值毫秒数。
JSON序列化与解析
序列化是指,将数据结构转换为字节或字符流。也叫marchaling或者pickling.
JSON支持primitive value和str, true, false, null, 以及在这些原始值基础上构建的对象和数组。不支持Map/Set/RegExp/Date/TypedArray.
JSON.stringify()序列化;JSON.parse()反序列化。这对函数可以用来创建可序列化对象和数组的深度副本。stringify的第三个参数指定数据格式化为多行缩进格式,如果是数值,指定的是缩进空格数;如果是空白符字符串,则使用该字符串做缩进。
JSON自定义:如果stringify方法在序列化的时候碰到了不支持的值,会查找这个值是否有toJSON方法,如有,就调用。Date有toJSON, 这意味着如果序列化的对象包含Date, 那么该日期会自动转换为一个字符串,反序列化的时候,创建的对象就不完全一样了。如果想复活这个Date对象,可以给JSON.parse()的第二个参数传一个reviver函数,该函数会在解析每个原始值时调用。这个复活函数有两个参数,属性名(包括对象属性名和数组索引)和原始值,返回值是属性的新值。stringify方法也支持通过第二个参数来自定义输出字符串。

国际化API
Intl.NumberFormat、Intl.DateTimeFormat、Intl.collator.
控制台API
略
URL API
并非ECMA标准里的,但是所有浏览器和Node都实现了。
计时器
setTimeout/setInterval/clearTimeout/clearInterval