本文写于2018年4月11日,于2019年5月15日发布在博客上。
JS标准库的内容可以在MDN阮一峰的网道教程上找到,其中一部分是ES2017以及更新版本的语言特性。
因为日常使用可能会记不清某些方法的用法(例如Object一类)和具体细节,因此写一篇JS标准库备忘录给自己查阅。

内置对象和函数

几个常用值:
Infinity 全局对象的成员,表示无穷大,默认值为Number.POSITIVE_INFINITY
NaA 全局对象的成员,表示非数字,默认值为Number.NaN
undefined 全局对象的成员,表示未定义值;有些情况下,undefined可能会被赋值修改成别的值,使用void 0可以返回绝对正确的undefined
null 基本类型,表示空值;typeof null === 'object'需要注意

全局方法:
eval( ) 执行传入其中的JS代码,返回这些代码执行后的返回值。直接调用该方法,如果产生了变量则是局部变量;通过引用调用该方法,则会生成全局变量,需要注意
encodeURI( ) decodeURI( ) 编码或者解码一个URI字符串,例如&、@、#、+之类的URI中使用的字符是不会被编码的,无法完成时会产生URIError错误
encodeComponentURI( ) decodeComponentURI( ) 编码或者解码一个URI字符串,与上面的方法不同,该方法对于上面的在URI中有特殊用处的字符串也会进行编码

不推荐使用的方法:
isNaN( ) 不推荐使用该全局方法,建议使用Number.isNaN( )取代
isFinite( ) 不推荐使用该全局方法,建议使用Number.isFinite( )取代
parseFloat( ) 不推荐使用该全局方法,建议使用Number.parseFloat( )取代
parseInt( ) 不推荐使用该全局方法,建议使用Number.parseInt( )取代

JS对象的几个概念:
本地对象:ES提供实现的对象,包括了ObjectNumber
内置对象:ES实现、独立于宿主的镀锡,在运行环境生成时即被初始化好的,目前只有GlobalMath对象
宿主对象:由当前运行宿主提供的对象,例如浏览器的BOM和DOM对象,例如Node.js的Process对象等
用户自定义对象:开发人员代码所创建的对象

Array.prototype

.length (原型上)表示数组长度,减小该值将删去尾部元素,增加该值则新增元素为undefined

会修改数组内容的方法:
.push( item ) 修改数组,末尾追加一个元素,返回数组新的长度
.pop( ) 修改数组,末尾移除一个元素,返回移出的元素
.unshift( item ) 修改数组,开头追加一个元素,返回数组新的长度
.shift( ) 修改数组,开头移除一个元素,返回移出的元素
.reverse( ) 修改数组,反转所有元素的顺序,返回引用
.sort( [fn] ) 修改数组,按照给定的排序回调来排序,返回引用;注意默认是当做字符串来排序
.splice( [start=0] [,delLength=this.length] [, ...newItem] ) 修改数组,从指定下标元素的前一位开始删除数个元素,然后再插入数个元素,返回被删除的元素的数组
.fill( value [,start=0] [,end=this.length] ) 修改数组,将所有元素填充成指定的值

不会修改数组内容的方法:
.concat( ...arrsOrValue ) 返回一个当前数组连接所有值和数组后的新数组
.join( [separator=','] ) 返回当前数组用给定分隔符连接形成的字符串
.slice( [start=0] [,end=this.length] ) 返回选取从开头到结尾下标的新数组;参数可以为负数
.indexOf( item [,fromIndex=0] ) 返回给定元素在数组中首次出现的下标位置;找不到则返回-1
.lastIndexOf( item [,fromIndex=this.length-1] ) 同上,但返回在数组末次出现的下标位置
.includes( item [,fromIndex=0] ) 返回数组是否包含某个元素的布尔值

遍历数组的方法:(以开始遍历时的length为准,遍历中新增的元素不会被遍历到)
.forEach( fn [,thisArg] ) 依次对元素执行回调,它不会修改数组,返回undefined
.every( fn [,thisArg] ) 依次对元素执行回调,只有在所有回调返回值全为true时候,该函数才返回true,否则返回false
.some( fn [,thisArg] ) 同上,但是任何回调返回true时该函数直接返回true
.filter( fn [,thisArg] ) 依次对元素执行回调,将返回值为true的元素形成新数组返回
.map( fn [,thisArg] ) 依次对元素执行回调,将返回值形成新数组返回
.find( fn [,thisArg]) 从数组中找到并返回首个执行回调返回true的值,找不到则返回undefined
.findIndex( fn [,thisArg]) 同上,但是返回值是找到的元素的下标,找不到则返回-1

以上方法中,回调函数的参数均是fn(current, index, array),三个参数依次表示当前元素值、当前元素坐标、原数组。

.reduce( fn [,initValue=this[0]] ) 接受回调fn(sum,current,index,array),参数依次是之前的计算结果、当前元素的值、当前元素的坐标、原数组,依次对数组中的元素执行回调,并将结果用于下一个元素
.reduceRight( fn [,initValue=this[this.length-1]] ) 同上,但从数组尾部开始
.keys( ) .values( ) .entires( ) 返回数组键/值/键值对的迭代器

Array

new Array( length ) 返回一个指定长度的空数组
new Array( ...items ) 用多个参数形成一个数组并返回
.form( arrLike [,mapFn] [,thisArg] ) 将伪数组或迭代器转为数组并返回
.of( ...items ) 将多个参数转为数组并返回
.isArray( val ) 判断给定的值是否为数组,返回布尔值

String.prototype

.length 返回字符串长度
[index] 返回指定下标的字符,注意这是只读的
.concat( ...strs ) 拼接多个字符串并返回拼接结果
.includes( str [,index=0] ) 判断字符串是否包含并返回布尔值
.indexOf( str [,index=0] ) 查找并返回另一个字符串首次出现的下标,找不到则返回-1
.lastIndexOf( str [,index=this.length-1] ) 同上,从尾部查找
.split( separator [,limit] ) 以指定分隔符或正则表达式将字符串分割为数组并返回
.slice( start [,end=this.length] ) 按下标提取并返回字符串的一部分;参数可以为负数
.substring( start [,end=this.length] ) 同上,处理参数更智能
.substr( start=0 [,length=this.length] ) 按长度提取并返回字符串的一部分
.repeat( count ) 将字符串重复并连接,返回结果
.search( reg ) 查找并返回首次匹配正则表达式的下标,查找不到则返回-1
.match( reg ) 查找并返回匹配捕获正则表达式的值,是一个数组,未匹配则返回null
.replace( reg , newStr|fn ) 将匹配正则表达式的子串替换为新的字符串或回调结果
.replace( str , newStr|fn )第一次匹配字符串的子串替换为新的字符串或回调结果
.chatAt( index ) .charCodeAt( index ) 返回指定下标的字符或者unicode编码单元
.codePointAt( index ) 返回指定下标的字符的编码单元体现数字,可以用于处理UTF-16字符
.toLowerCase( ) .toUpperCase( ) 返回转为小写/大写的字符串
.toLocalelLowerCase( ) .toLocaleUpperCase( ) 同上,但按照本地化方式处理
.trim( ) 删除两侧/左侧/右侧的不可见字符
.padStart( length [,str=' '] ) 在字符串的开头用指定字符串填充到指定长度并返回
.padEnd( length [,str=' '] ) 同上,但位置改为结尾
.startWith( str [,index=0] ) 判断字符串是否以指定字串开头,返回布尔值
.endsWith(str [,index=this.length] ) 同上,但改为判断结尾
.normalize( [opt='NFC'] ) 按照unicode正规化方式处理字符串并返回,参数还可选NFDNFKCNFKD
.localeCompare( str [,loacl] [,opt] ) 用于字符串本地化排序,返回数字;参见MDN

正则表达式相关方法详细用法:
.match( reg ) 查找并返回匹配捕获正则表达式的值,结果是一个数组,未匹配则返回null
当参数reg未使用g标记时:
未匹配到,则返回null
匹配到则返回一个数组,其0下标是首次匹配到的字符串;
1、2、3…等下标依次是使用括号捕获的字符串;
数组带有.index表示初次匹配的下标;
数组带有.input表示原始输入字符串;
数组带有.groups表示具名组匹配的分组信息,是一个对象或是undefined

当参数reg启用了g标记时:
返回一个数组,表示所有匹配到的字符串;未匹配到则返回null

.replace( reg , newStr|fn ) 将匹配正则表达式的子串替换为新的字符串或回调结果
如果第二个参数是字符串,那么可以在字符串里面使用以下转义标记:
$$ 表示$字符串本身
$& 表示匹配的子串
$` 表示匹配子串左边的剩余字符串内容
$' 表示匹配子串右边的剩余字符串内容
$n 从1开始,$n表示括号捕获的第n个字符串

如果第二个参数是函数,它的参数形如:
fn( match, ...p, offset, string)
其中,match表示匹配的子串(即$&),p是多个参数表示被括号捕获的字符串(即$n),offset是匹配的子串在原字符串中的偏移量,string是原字符串

Function.prototype

.name 返回方法名,匿名方法返回anonymous
.length 返回方法所需要参数个数,注意带默认值的参数和REST形式参数是不计入的
.call( thisArg [,argsArr=[]] ) 传入一个值作为方法内部的this来执行该方法,argsArr是一个表示参数的数组
.apply( thisArg [, ...args] ) 同上,但是参数形式是REST形式
.bind( thisArg [, ...args] ) 同上,但是返回一个新方法,新方法绑定了this和预先准备的参数

new Function([...args] ,funcStr ) 参数args表示方法的参数,funcStr表示方法体内的字符串,返回一个这样的方法

Object.prototype

.hasOwnProperty( propName ) 返回表示对象自身(即不包括原型)是否包含该属性的布尔值
.isPropertyOf( obj ) 返回表示该对象是否在obj参数的原型链上的布尔值
.propertyIsEnumerable( propName ) 返回表示某个属性是否能被枚举的布尔值,只对对象自身的属性有效
.valueOf( ) 返回对象的原始值形式
.toString( ) .toLocaleString( ) 返回对象的字符串/本地化字符串表示形式,未被重载时形如[object xxx]

Object

.assign( target [, ...item] ) 合并对象,将所有item对象的属性合并到target,返回合并后的引用;注意是浅拷贝,重复的属性后面的覆盖前面的
.create( proto [, assign=undefined] ) 以一个原型作为__proto__创建一个新对象;assign参数表示要合并入新对象的属性
.is( v1, v2 ) 类似于===运算符,有两点例外:+0不等于-0、并且NaN与自身相等
.defineProperty( obj, prop, des ) 以指定的属性描述符在对象上定义属性
.defineProperties( obj, props ) 同上,第二个参数是一个对象,可以设置多个属性
.getOwnPropertyDescriptor( obj, prop ) 获取obj.prop的属性描述符,没有该属性则返回undefined
.getOwnPropertyDescriptors( obj ) 同上,但是列出所有属性的描述符
.getOwnPropertyNames( obj ) 返回一个对象自身所有属性名数组,包括不可枚举的,Symbol属性除外
.getOwnPropertySymbols( obj ) 返回一个对象自身所有Symbol属性数组
.getPropertyOf( ) .setPropertyOf( ) 设置或获取对象的__proto__
.keys( ) .values( ) .entries( ) 获取对象的键/值/键值对的枚举器;不同于for in,因为这些方法不遍历原型链
.preventExtensions( ) .isExtensible( ) 阻止对象添加元素
.seal( ) .isSealed( ) 密封对象,阻止增/删/配置属性
.freeze( ) .isFrozen( ) 冻结对象,阻止增/删/配置属性,对象的任何值均无法修改

属性描述符相关:
属性描述符是一个对象,它一定具备这两个属性:
.enumerable 表示可枚举性,不可枚举的属性无法被Object.keys( )JSON.stringify( )for...in...遍历到
.configurable 表示可配置性,不可配置的属性无法被删除,属性描述符不能被修改(.writable改为false

在一个对象上直接定义新的属性,它的描述符的.enumerable.configurable默认为true
但使用Object.defineProperty( )定义的新的属性,它的描述符的.enumerable.configurable默认为false

属性描述符有两种形式,分为数据描述符存取描述符,只能使用其中一种,
如果是数据描述符的形式,它还具备以下属性:
.value 表示值本身
.writable 表示值是否可被修改,如果.writable.configurable都为false,那么值不可修改
如果是存取描述符的形式,它还具备以下属性:
.get 一个取值函数
.set 一个存值函数,它有一个参数表示新的值

Number.prototype

.toExponential( [n] ) 返回数字指数形式的字符串n表示显示小数的最大位数
.toFixed( [n=0] ) 返回数值保留n位四舍五入的结果的字符串
.toPrecision( [n=0] ) 返回数值阶段n位的结果的字符串,较多的位数会使用科学计数法
.toLocaleString( ) 以本地化形式返回数值的字符串结果,可以配置显示货币样式、千分符样式等,参见MDN

Number

.EPSILON 两个可区分数值的最小间隔
.MAX_SAFE_INTEGER .MIN_SAFE_INTEGER 最大/最小的安全整数
.MAX_VALUE .MIN_VALUE 最大/最小数字值
.NaN 表示非数字值
.NEGATIVE_INFINITY .POSITIVE_INFINITY 正负无穷大
.isNaN( ) 判断一个数是否为NaN,它不会强制转换成数字
.isFinite( ) .isInteger( ) .isSafeInteger( ) 判断是否是有限数/整数/安全整数,它不会强制转换成数字
.parseInteger( ) .parseFloat( ) 将参数转化成数值

new Number( ) 使用较少,一般转换成数值使用Number( val )

Math

.E .LN2 .LN10 .LOG2E .LOG10E .PI .SQRT1_2 .SQRT2
分别表示e、㏑2、㏑10、㏒2e、㏒10e、π、√½、√2
.abs( ) 计算数值的绝对值
.sin( ) .cos( ) .tan( ) 三种三角函数
.asin( ) .acos( ) .atan( ) .sinh( ) .cosh( ) .tanh( ) 反三角函数、双曲三角函数
.asinh( ) .acosh( ) .atanh( ) 反双曲三角函数
.sign( ) 返回0、-1、+1来判断一个数的符号
.sqrt( ) .cbrt( ) 平方根/立方根
.log( ) .log1p( ) .log10( ) .log2( ) 返回㏑x 、1+㏑x 、lgx 、log2x的值
.exp( ) .exmp1( ) .pow(a, b) 返回e的x次幂/e的x次幂-1/a的b次幂
.max( ...n ) .min( ...n ) 返回所有参数中的最大/最小值
.fround( ) .imul( ) 返回一个小数在单精度32位10进制中精确表示的值/32位乘法表示的值
.round( ) .ceil( ) .floor( ) .trunc( ) 小数四舍五入取整/向上取整/向下取整/阶段取整
.random( ) 获取0(包含)到1(不含)的伪随机数
.clz32( ) 返回一个数在32位中表示时前导0的个数
.hypot( ) 返回参数总所有数的平方和的平方根

JSON

.parse( str [,fn] ) 将一个JSON字符串反序列化成JS对象返回
该方法可以传入一个回调参数,形如fn( key, value )
对于解析出的每个键值对,都将传入该回调(自内向外),并根据返回值修改原来的值,类似map方法
如果该回调返回undefined,那个传入的键值对将被移除
注意顶层对象传入的key是空字符串

.stringify( obj [,fn] [,space] ) 将一个JS对象序列化为字符串
该方法可以传入一个回调参数,形如fn( key, value),用于修改值
参数space用于美化输出,表示缩进空格个数,最多为10
注意,Symbol、不可枚举属性、undefined、函数是不会被序列化的;Symbol甚至都不会执行fn回调

Date相关

Date.prototype原型上的方法:
.getFullYear( ) .setFullYear( ) 设置或获取年份;set方法还可一并设置月、日
.getMonth( ) .setMonth( ) 设置或获取月份,月份从0开始,到11为止;set方法还可一并设置日
.getDate( ) .setDate( ) 设置或获取日,取值1-31;设置小于或超过当前月范围的,会自动转换成上/下个月的对应日
.getDay( ) .setDay( ) 设置或获取每周的第几天(周几)
.getHours( ) .setHours( ) 设置或获取小时数,取值0-23
.getMinutes( ) .setMinutes( ) 设置或获取分钟数,取值0-59
.getSeconds( ) .setSeconds( ) 设置或获取秒数,取值0-59
.getMilliseconds( ) .setMilliseconds( ) 设置或获取毫秒数,取值0-999
.getTime( ) .setTime( ) 设置或获取timestamp值
以上方法均有对应的setUTCxxx/getUTCxxx版本,表示以世界时为标准

Date本身的方法:
new Date( ) 可以创建一个时间日期对象,它有多种重载:
new Date( ) 以当前时间创建
new Date( timestamp ) 按照基于1970年1月1日凌晨时的毫秒数
new Date( str ) 格式化字符串创建时间日期对象
new Date( year, month, day, hour, minute, second, millisecond) 按照给定的参数创建,year后的参数可选,不提供的参数默认为最小值

.now( ) 返回当前的timestamp
.parse( str ) 解析一个时间日期字符串并返回其timestamp,无法解析时返回NaN
UTC( ) 接受参数类似new Date()的最后一种重载方式,但是该方法返回timestamp

Boolean相关

new Boolean( val ) 生成一个Boolean对象;注意即使值为false的包装对象,也是被视为truly
Boolean( val ) 强制转换一个值为布尔值
0-0nullundefinedNaN''会被视为falsy值,document.all也是falsy值,其他值均为truly

Symbol相关

Symbol( name ) 返回一个Symbol对象;注意Symbol对象无法使用new创建
Symbol.for( name ) 尝试按名查找的Symbol对象,如果找不到则新建一个返回;注意新建的是在全局环境,可在iframe等情况下保持单例
Symbol.keyFor( name ) 尝试按名查找使用Symbol.for()创建的一个Symbol对象,如果找不到则返回undefined

JS将很多对象私有属性部署为内置Symbol值,共有以下11个:
Symbol.hasInstance( obj ) 用于提供instanceof运算符的实现
Symbol.isConcatSpreadable 定义对象是否可以被调用Array.prototype.concat( )时展开,只有值为false时不能展开
Symbol.species 定义创造衍生对象时使用这个属性返回的函数作为构造函数(它是一个getter)
Symbol.match 一个函数,执行str.match( obj )时会调用这个函数(当前对象作为第一个参数)
Symbol.replace 一个函数,执行str.replace( obj )时会调用这个函数(当前对象作为第一个参数)
Symbol.search 一个函数,执行str.search( obj )时会调用这个函数(当前对象作为第一个参数)
Symbol.split 一个函数,对象被String.prototype.split( obj )调用时会使用该函数(当前对象作为第一个参数)
Symbol.iterator 默认迭代器;迭代器可以是一个function *类型函数,使用yield返回值
Symbol.toPrimitive 将对象转换成原始值的转换函数,形如fn( type ),参数type表示想转换为值类型,可以是numberstringdefault
Symbol.toStringTag 使用.toString( )得到的字符串如果形如[object Object]这种两个字符串的形式,该函数定义了后面那个字符串(这里是Object)的值
Symbol.toStringTag 一个对象,表示在使用with运算符时,那些属性(对象中值为truly的键名)会被with环境排除

Error相关

new Error( text ) 创建一个错误,其中的参数为提示文字
JS内置了6种错误类型:
EvalError 使用eval( )动态执行代码时出错
RangeError 变量或参数超出有效范围
ReferenceError 无效的引用
SyntaxError 语法解析错误
TypeError 变量或参数不属于有效类型
URIError 使用encodeURI( )系列方法时参数无效
ImternalError 这不是标准规范中的错误类型,它表示引擎内部错误(例如递归层数过多)

错误对象的原型属性:
Error.prototype.name 错误的名称
Error.prototype.message 错误的提示问题

RegExp相关

new RegExp( str [,flags] ) 使用给定的字符串和标志位创建正则表达式
/str/flags 同上,这种方式创建正则表达式不需要转义字符串

正则表达式的标志位flags的含义和用法:
g (RegExp.prototype.global) 表示全局匹配,将对匹配目标从头到尾匹配出现内容,否则会在第一次匹配后停止
i (RegExp.prototype.ignoreCase) 忽略大小写
m (RegExp.prototype.multiline) 多行模式,^ $将适用于每一行而不是整体
u (RegExp.prototype.unicode) 开启unicode支持
y (RegExp.prototype.sticky) 粘连匹配,即后一个匹配位置必须紧邻前一个
s (RegExp.prototype.dotAll) 点.可以表示任何单个字符,包括行终止符

RegExp.prototype上的属性:
.source 当前正则表达式模式字符串
.flags 当前正则表达式所有标志位,是一个字符串
.lastIndex 开启g标志位时有效,表示下一次匹配开始位置,在达到字符串长度后重设为0
.test( str ) 返回与指定字符串匹配与否的布尔值;开启g标志位后将修改.lastIndex,可以用于多次匹配
.exec( str ) 返回值同String.prototype.match( reg )

Map相关

new Map( ) 创建一个Map对象;注意键之间是用Object.is进行比较
new Map( obj ) 参数如果是一个可遍历对象,则每个元素都成为键和值

Map.prototype上的属性:
.size( ) 获取元素个数
.get( key ) .set( key, value ) 获取/设置键值
.delete( key ) .clear( ) 依键删除/全部删除
.has( key ) 依键判断是否存在
.keys( ) .values( ) .entries( ) 返回所有键/值/键值对的枚举器
.forEach( fn [,thisArg] ) 依次对键值执行回调,回调fn( key, value, map ),这个函数返回undefined

Set相关

new Set( ) 创建一个Set对象;其构造函数形如Map类型

Set.prototype上的属性:
.size( ) 获取集合中元素的个数
.add( item ) .delete( item ) .clear( ) 添加/删除/清空元素
.keys( ) .values( ) .entries( ) 返回所有键/值/键值对的枚举器;Set的键和值完全相同
.forEach( fn [,thisArg] ) 依次对元素执行回调,回调fn( item, map ),这个函数返回undefined

WeakMap、WeakSet相关

new WeakMap( ) new WeakSet( ) 可以创建相应的对象

WeakMap.prototype只具有以下方法:
.get( key ) .set( key, value ) .has( key ) .delete( key )
没有.clear( )

WeakSet.prototype只具有以下方法:
.add( item ) .delete( item ) .has( item ) .clear( item )

Promise相关

new Promise( fn ) 创建一个Promise对象,其回调形如fn( resolve, reject )
注意必须调用resolve( )或者reject( ),否则Promise将一直处于pending状态
Promise.all( arr ) 返回一个新的Promise,数组中所有的Promise完成后它才会完成,完成Promise的返回值会构成一个数组来作为它的返回值;如果任一Promise失败,它也将失败,返回值为首个失败的Promise的返回值
Promise.race( arr ) 同上,但是数组中任一Promise完成后它也会完成,返回值为首个完成的Promise的返回值
Promise.resolve( ) 将一个值包装成Promise,已经是Promise的值将直接返回;如果带有.then( )方法还将调用之
Promise.reject( ) 行为类似Promise.resolve( ),但是将包装成失败的Promise

Promise.prototype上的属性:
.then( resFn [,rejFn] ) 接受的值或错误值会传入resFn( )rejFn( ),可以继续添加.then( ),回调的返回值将作为它.then( )中回调方法的参数
.catch( rejFn ) 处理拒绝的情况
.finally( fn ) 不论完成还是失败都将执行,fn回调没有任何参数

Reflect

.apply(f, thisArg, args) 该方法类似于f.apply(thisArg, args)
.construct(f, args [,newTarget]) 该方法类似于new f(args)表达式,如果指定了newTarget参数,会改变new.target
.ownKeys(obj) 返回一个对象自身的所有键名组成的数组,它包括Symbol键和不可枚举的属性
.defineProperty(obj, propName, desc) 类似于Object.defineProperty()
.deleteProperty(obj, propName) 类似于delebt obj[propName]表达式
.get(obj, propName) 类似于obj[propName]表达式
.set(obj, propName, newValue) 类似于obj[propName]=newValue表达式
.has(obj, propName) 类似于propName in obj表达式
.getOwnPropertyDescriptor(obj, key) 返回对象自身的指定属性名的属性描述符;如果对象上没有这个属性,返回undefined
.getPrototypeOf(obj) 获取一个对象的隐式原型(.__proto__原型链原型)
.setPrototypeOf(obj, val) 设置一个对象的隐式原型
.isExtensible() 类似于Object.isExtensible( )
.preventExtensions() 类似于Object.preventExtensions()

Proxy相关

new Proxy(target, handler) 创建一个代理对象,包装target参数,使用handler对象里面的选项
Proxy.revocable(target, handler) 它的返回值是一个对象,包含.proxy属性与上面的方法相同,包含.revoke方法,调用该方法可以永久撤掉代理
参数中的handler是一个对象,它可以包含多个方法,表示代理对象执行的相应操作
这些方法的名字和参数类型形如Reflect上的方法,此处不再赘述

Generator.prototype

形如function* func1()的方法是生成器方法,它可以使用yield来返回值
这类方法返回生成器对象,它具备以下属性:
.next() 获取下一个结果,该方法返回一个对象,带有donevalue两个属性;它可以带有一个参数传入yield语句用于向生成器方法内部注入值(首次调用生成器时该参数不会被使用)
例如生成器方法中有语句let a=yield 1000;,如果调用生成器返回对象的.next(888),除非是首次调用,这个a的值会变成888
.return() 结束生成器,也就是返回一个done:true的对象;可以传入一个参数,参数将成为value属性
.throw(errMsg) 向生成器抛出一个错误