es6标准入门读书笔记.md
es6标准入门读书笔记
ECMAScript是JavaScript语言的国际标准,JavaScript是ECMAScript的实现.
第一章 let和const
- ECMAScript从草案到正式标准,一共有从stage0到stage4五个阶段, 所以babel的
babel-preset-stage-0
表示的支持最新的ECMAScript标准(p9。)
第二章 let和const
两者共同点
- 不存在变量提升;
- 都有暂时性死区:只要块级作用域存在let或者const命令,它所声明的变量就不再受外部影响,并且在声明之前使用会报错;
- 不允许重复声明;
- 都有块级作用域,外层作用域无法读取内部作用域的变量,内层作用域可以定义外层作用域的同名变量;
- 声明的全局变量不属于全局对象的属性(p17。)
const
- const一旦声明常量,就必须立即初始化;
- 对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址,const只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以把一个对象声明为常量后该对象依然可以改变数据。要将一个对象完成声明为常量,可以使用Object.freeze()方法。
第三章 变量的解构赋值
ES6允许按照一定模式,从数据和对象中提取值,对变量进行赋值,这被称为结构。
数组的解构赋值
- 如果解构不成功,变量的值就等于undefined;
- 变量可以设置默认值,默认值生效的前提是该变量对应的数组成员严格等于undefined;
对象的解构赋值
- 对象的解构与数组的一个重要不同是:数组的元素是按次序排列的,变量的取值由它的位置决定,而对象的属性是没有次序的,变量必须与属性同名,才能取到正确的值;
对象的解构赋值的内部机制,是先找到同名属性,然后在赋给对应的变量。真正被赋值的是后者,而不是前者。
// 对象的赋值是以下形式的简写 var { foo: foo, bar: bar } = { foo: 'aaa', bar: 'bbb' } // 真正被赋值的是变量baz,而不是模式foo var { foo: baz } = { foo: 'aaa', bar: 'bbb' } baz // 'aaa' foo // error: foo is not defined
- 对象的解构也支持默认值,默认值生效的条件是,对象的属性值严格等于undefined;
字符串的解构赋值
- 对字符串进行解构赋值时字符串被转换成了一个类似数组的对象。
数值和布尔值的解构赋值
- 如果等号右边时数值或者布尔值,则先转为对象。
函数参数的解构赋值
函数参数是一个数组或者对象时,可以解构赋值:
function add([x,y]) { return x+y; } add([1, 2]) // 3 function move({x, y}) { return [x, y] } move({x:1, y:2}) // [1, 2]
上面的例子就是函数参数的解构赋值,但是这其实是简写的,上面第一个例子的意思是,add函数需要传入一个参数,然后[x,y]对这个参数进行解构赋值,因为需要赋值的是一个数组[x, y],所以这里解构赋值的规则和数组的规则一样。
同理,对move()的函数的解构赋值也是一样的。只是这里需要赋值的是一个对象,所以这里解构的规则就和对象的解构赋值一样。函数参数的解构也可以使用默认值
function move1({x = 0, y = 0}) { return [x, y] } function move2({x,y} = {x: 0, y:0}) { return [x, y] }
- 上面的例子使用的默认值分别表示不同的意思。
- move1函数给要赋值的x,y使用了默认值,表示当解构不成功,即x,y对应的传入的参数的x或者y属性为undefined时,则使用默认值。
- move2函数是给要穿入的参数使用了默认值,只有传入的参数为undefined或者不传参数时,才会使用参数的默认值。
- 一般来说第一种写法更符合一般业务代码的需求,即给要用到的变量一个默认值。
用途
- 交换变量的值:
[x, y] = [y, x]
从函数返回多个值
对于返回对象或者数组的函数,可以用解构赋值来接收函数的返回值。
function example(...args) { return [1,2,3,4,5]; } const [a,b,c,d,e] = example(); a //1 b //2
提取JSON数据
const jsonDate = { id: 1, name: 'YAN7', msg: { a: 'aaa', b: 'bbb' } } const {id, name, msg} = jsonData; console.log(id, name, msg) // 1, YAN7, {a: 'aaa', b: 'bbb'} // react中经常用这个方法提取props或者state的值
函数参数的默认值
funtion add({x=1, y=2}) { return x + y; }
- 遍历Map结构(Map数据结构不熟,暂先略过)
第四章 字符串的扩展
4.1 字符的Unicode表示法
对于编码,字符之类暂先略过。
4.2 codePointAt()
- 这个方法能够正确的处理4个字符储存的字符,返回一个字符的码点
4.3 String.fromCodePoint(str)
- 传入一个码点,返回对应的字符。
4.4 at()
返回字符串给定位置的字符。
'abc'.at(0) // a
4.5 includes(), startsWith(), endsWith()
- inlcudes: 返回布尔值,表示是否找到了参数字符串。
- startsWith: 返回布尔值,表示参数字符串是否在源字符串的头部。
- endsWith: 返回布尔值,表示参数字符串是否在源字符串的尾部。
- indexOf:ES5的方法,返回参数字符串在源字符串的index值,如果不在源字符串中,则返回-1。
4.6 repeat()
- repeat返回一个新字符串,表示将源字符串重复n次。
- 参数如果是小数,会向下取整。
- 参数如果是负数或者Infinity,会报错。
- 参数如果是0到-1之间的小数,则等同于0,参数NaN同样相当于0。
- 参数如果是字符串,则先转成字符串。
4.7 padStart(), padEnd()
- 这两个方法用来补全字符串,会在头部或者尾部补全。
- 这两个方法接收两个参数,第一个表示要补全的字符串的最小长度,第二个表示填充的字符串。
- 如果省略了第二个参数,则会用空格填充。
4.8 模板字符串
- 模版字符串用反引号作为标识,如果用变量则用${变量}表示。
第六章 数值的扩展
5.1 二进制和八进制数值表示法
- ES6中分别用前缀0b(或0B)和0o(或0O)来表示二进制和八进制。
5.2 Number.isFinite()和Number.isNaN()
Number.isFinite()
用来检查一个数值是否非无穷,(注意,是检查非无穷);Nunber.iaNaN()
用来检查一个值是否是NaN.
5.3 Number.isinteger()
Number.isInteger()
用来检查一个值是否为整数.
5.4 Number.EPSILON
- 这是一个极小的常量,由于js中对浮点数的计算并不精确,所以ES6认为只要计算的得出的结果与正确结果相差小于这个常量,那么就认为计算结果是精确的。
5.5 Math对象的扩展
- Math.trunc(): 用于去除一个数的小数部分,返回整数部分;
- Math.sign(): 用于判断一个数到底是正数,负数,还是零;
- Math.cbrt(): 用于计算一个数的立方根;
- Math.clz32(): 返回一个数的32位无符号整数形式有多少个前导0;
- Math.imul(): 返回两个数以32位带符号整数形式相乘的结果,返回的也是一个32位的符号整数,大多数情况下,这个函数返回的结果和两个参数直接相乘的结果是相同的(超出32位的部分溢出);
- Math.fround(): 返回一个数的单精度浮点数形式;
第七章 数组的扩展
7.1 Array.from()
- 这个方法用于将两类对象转位真正的数组:类似数组的对象和可遍历对象;
- 类数组是一个带有length属性的对象;