一、let 和 const 命令
let
1、let用来声明变量,只在自己的代码块中生效
2、let不存在变量提升
3、暂时性死区:如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错
4、不允许重复声明
5、存在块级作用域(原因:循环中的变量成了全局变量)
6、块级作用域中能声明函数,但是类似于let,不能在块级作用域外使用,块级作用域必须有大括号
Const
1、声明一个只读的变量,一旦声明立即初始化,不能留到后边赋值
2、只在声明的块级作用域中生效
3、同样存在暂时性死区
4、不能重复声明
5、存在块级作用域
6、简单数据类型来说是值不能改变,但是对于复杂数据类型来说是指针指向的内存地址不能改变,但是复杂数据类型的值是可变的
Es6六种声明变量的方法
let const function import class var
顶级对象的属性及全局变量
var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩
二、变量的解构赋值
从数组和对象中提取值,对变量进行赋值,这被称为解构
1、数组的解构赋值
(1) 可以从数组中提取值,按照对应位置,对变量赋值
(2) 如果解构不成功,变量的值就等于undefined
(3) 等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以
(4) 解构赋值允许指定默认值
2、对象的解构赋值
(1) 对象的属性没有次序,变量必须与属性同名,才能取到正确的值
(2) 对象的解构也可以指定默认值
3、字符串的解构赋值
(1) 字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象
4、数值和布尔值的解构赋值
(1) 只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值
5、函数参数的解构赋值
(1) 参数中传入数组的话函数中会自动识别数组中的项
(2) 函数参数部分使用对象可以设置默认值
6、圆括号问题
7、用途
交换变量的值
从函数返回多个值
函数参数的定义:解构赋值可以方便地将一组参数与变量名对应起来。
提取 JSON 数据:解构赋值对提取 JSON 对象中的数据,尤其有用。
函数参数的默认值
遍历 Map 结构
输入模块的指定方法
三、字符串的扩展
ES6 加强了对 Unicode 的支持,允许采用uxxxx形式表示一个字符,其中xxxx表示字符的 Unicode 码点
ES6 为字符串添加了遍历器接口(详见《Iterator》一章),使得字符串可以被for...of循环遍历
模板字符串:反引号标识,可以单行也可以多行,或者在字符串中嵌入变量,模板字符串中如果使用反引号要进行转义,空格和换行会被保留,如果想去除换行的话在模板字符串后边使用trim方法消除它,变量写在${}中,大括号中可以放入任意js表达式,可以进行运算,以及应用对象属性,可以调用函数。大括号中的值不是字符串将默认调用对象的toString方法。大括号中如果是字符串将原样输出。模板字符串能嵌套,
四、字符串的新增方法
String.fromCodePoint()用于从 Unicode 码点返回对应字符,但是这个方法不能识别码点大于0xFFFF的字符
String.raw()该方法返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,往往用于模板字符串的处理方法
实例方法:codePointAt()
实例方法:normalize()
实例方法:includes(), startsWith(), endsWith()包含参数字符串,以参数字符串开始结尾
实例方法:repeat()返回新的字符串,将指定的字符串重复n次,参数不能为负
实例方法:padStart(),padEnd()字符串不够指定长度在开头(结尾)以指定字符串不全
实例方法:trimStart(),trimEnd()消除头部(尾部)的空格,不会改变原字符串
实例方法:matchAll()返回一个正则表达式在当前字符串的所有匹配
五、正则的扩展
六、数值的扩展
1、二进制和八进制表示法:二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示,如果要将0b和0o前缀的字符串数值转为十进制,要使用Number方法
2、Number.isFinite()检测是否是有限的,非数值的返回false, Number.isNaN()用来检查一个值是否为NaN,Number.isFinite()对于非数值一律返回false, Number.isNaN()只有对于NaN才返回true,非NaN一律返回false
3、Number.parseInt(), Number.parseFloat() 将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变。
4、Number.isInteger()用来判断一个数值是否为整数
5、Number.EPSILON,ES6 在Number对象上面,新增一个极小的常量Number.EPSILON。根据规格,它表示 1 与大于 1 的最小浮点数之间的差。
6、Math.trunc方法用于去除一个数的小数部分,返回整数部分
7、Math.sign方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。
8、Math.sign方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。
9、Math.clz32()方法将参数转为 32 位无符号整数的形式,然后这个 32 位值里面有多少个前导 0
10、Math.imul方法返回两个数以 32 位带符号整数形式相乘的结果,返回的也是一个 32 位的带符号整数
11、Math.fround方法返回一个数的32位单精度浮点数形式
12、Math.hypot方法返回所有参数的平方和的平方根
13、Math.expm1(x)返回 ex - 1
14、Math.log1p()返回1 + x的自然对数,即Math.log(1 + x)。如果x小于-1,返回NaN。
15、Math.log10()返回以 10 为底的x的对数。如果x小于 0,则返回 NaN。
16、Math.log2(x)返回以 2 为底的x的对数。如果x小于 0,则返回 NaN
- Math.sinh(x) 返回x的双曲正弦(hyperbolic sine)
- Math.cosh(x) 返回x的双曲余弦(hyperbolic cosine)
- Math.tanh(x) 返回x的双曲正切(hyperbolic tangent)
- Math.asinh(x) 返回x的反双曲正弦(inverse hyperbolic sine)
- Math.acosh(x) 返回x的反双曲余弦(inverse hyperbolic cosine)
- Math.atanh(x) 返回x的反双曲正切(inverse hyperbolic tangent)
ES2016 新增了一个指数运算符(**)
七、函数的扩展
1、函数参数的默认值、与解构赋值默认值结合使用 (一般是在尾部,不然不能省略)
2、函数的length属性是没有指定默认值的参数的个数
3、 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了
4、函数的name属性,返回该函数的函数名
5、箭头函数
数组的扩展
1、扩展运算符console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5 [a,b,...c] = [1,2,3,4,5]
① 复制数组
1) 写法一a2 = a1.concat()const a1 = [1, 2];
2) 写法二const a2 = [...a1];
3) 写法三const [...a2] = a1;
② 合并数组 [...arr1, ...arr2, ...arr3]
③ 与解构赋值结合[a, ...rest] = list,只能放在参数的最后一位
④ 字符串 字符串转数组[...'hello']// [ "h", "e", "l", "l", "o" ]
⑤ 实现了 Iterator 接口的对象能转化成数组,没有遍历器的不能转化成数组
⑥ Map 和 Set 结构,Generator 函数
2、Array.from方法用于将两类对象转为真正的数组(dom对象)
3、Array.of()将一组值装换成数组(弥补Array()只有一个参数的缺陷)
4、数组实例的copyWithin方法,在当前数组内部,将指定位置的成员复制到其他位置
5、数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined,findindex方法返回的是对应的索引,如果都不符合返回-1(类似于indexof,但是indexof不能发现NaN)(indexOf使用的是严格的===所以没法判断NaN)
6、fill方法使用给定值,填充一个数组,数组中已有的元素,会被全部抹去。fill方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置。(不是深拷贝对象)
7、entries(),keys()和values()——用于遍历数组:keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。
8、Includes()用来判断数组中是否含有某个值,返回布尔值。第二个参数是起始值,默认为0,负数为倒数,大于数组长度重置为0
9、Flat()拉平数组,flat()默认只会“拉平”一层,如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数,默认为1
10、flatMap()方法对原数组的每个成员执行一个函数(相当于执行Array.prototype.map()),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。// 相当于 [[2, 4], [3, 6], [4, 8]].flat() [2, 3, 4].flatMap((x) => [x, x * 2]) // [2, 4, 3, 6, 4, 8]
11、数组的空位,js对数组的空位的处理很不一致,所以要避免使用空位
对象的扩展
对象的新增方法
Symbol
Symbol是第七种数据类型,表示独一无二的值,Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突
Set 和 Map 数据结构
Set
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。可以用来去重。
- add(value):添加某个值,返回 Set 结构本身。
- delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
- has(value):返回一个布尔值,表示该值是否为Set的成员。
- clear():清除所有成员,没有返回值。
Map
ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应