变量
ES5只有两种声明变量的方法:var
和function
命令;ES6中有六种:除了ES5的两种加上let
和const
还有import
和class
命令。
新增let
用于声明变量
块级作用域
不存在变量提升
暂时性死区
同一作用于内,不允许重复声明
新增const
声明只读常量
必须在初始化的时候赋值
块级作用域
没有变量提升,存在暂时性死区
生命的常量不可重复声明
对于符合类型的前两;变量名只是保证指向地址不变
变量解构赋值
模式匹配
不完全解构
var、let、const声明的变量都适用
允许指定默认值
解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量(真正被赋值的是后者)
解构赋值的变量都会重新声明;let和const中应该注意
解构可以用于嵌套结构的对象
字符串也可以解构赋值
数值和布尔值的解构赋值
解构赋值的规则是,只要等号右边的值不是对象,就先将其转为对象
字符串
字符串可以被for...of
循环遍历
includes(), startsWith(), endsWith()
includes():返回布尔值,表示是否找到了参数字符串。
startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。
endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。
三个方法都支持第二个参数,表示开始搜索的位置
repeat()
返回一个新字符串,表示将原字符串重复n次
参数如果是小数,会被取整
参数是负数或者Infinity,会报错(参数是0到-1之间的小数,则等同于0;先取整)
padStart(),padEnd()
字符串补全
模板字符串
用反引号(`)标识
模板字符串中嵌入变量,需要将变量名写在${}之中
模板字符串之中能调用函数
模板字符串能嵌套
数值
Number.isFinite(), Number.isNaN()
Number.isFinite()判断是否为小数
Number.isNaN()片段是否为空
只对数值有用;非数值都返回false
Number.isInteger()
判断是否为整数
安全整数和Number.isSafeInteger()
JavaScript能够准确表示的整数范围在-253到253之间(不含两个端点),超过范围,无法精确表示
Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER两个常量,来表示这个范围的上下限
数组
Array.from()
将类数组对象转化成正真的数组
// ES5的写法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']
// ES6的写法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']
Array.from可以接受第二个参数。作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
Array.of()
Array.of方法用于将一组值,转换为数组
弥补数组构造函数Array()的不足,参数个数的不同,会导致Array()的行为有差异
//只有当参数个数不少于2个时,Array()才会返回由参数组成的新数组
Array() // []
Array(3) // [, , ,]
Array(3, 11, 8) // [3, 11, 8]
Array.of() // []
Array.of(undefined) // [undefined]
Array.of(1) // [1]
Array.of(1, 2) // [1, 2]
copyWithin()
将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组
Array.prototype.copyWithin(target, start = 0, end = this.length)
find()和findIndex()
用于找出第一个符合条件的数组成员,它的参数是一个回调函数
回调函数可以接受三个参数,依次为当前的值、当前的位置和原数组
fill()
使用给定值,填充一个数组
fill方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置
entries(),keys()和values()
用于遍历数组,它们都返回一个遍历器
keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历
includes()
Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似
数组的空位
ES6则是明确将数组空位转为undefined
函数
函数参数的默认值
与解构赋值默认值结合使用
非尾部的参数设置默认值,实际上这个参数是没法省略的;可写作undefined
函数的length属性
回没有指定默认值的参数个数
函数参数的作用域
参数默认值是一个变量,则该变量所处的作用域,与其他变量的作用域规则是一样的,即先是当前函数的作用域,然后才是全局作用域
rest参数
用于获取函数的多余参数
扩展运算符
扩展运算符(spread)是三个点(…)
合并数组[1, 2, ...more]
与解构赋值结合
函数的返回值
字符串转化成数组[...'hello']
[ "h", "e", "l", "l", "o" ]
实现了Iterator接口的对象
name属性
函数的name属性,返回该函数的函数名
Function构造函数返回的函数实例,name属性的值为“anonymous
箭头函数
使用“箭头”(=>)定义函数
函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象
不可以当作构造函数,也就是说,不可以使用new命令
不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替
不可以使用yield命令,因此箭头函数不能用作Generator函数
this对象的指向是可变的,但是在箭头函数中,它是固定的
尾调用优化
尾调用是指某个函数的最后一步是调用另一个函数
尾调用不一定出现在函数尾部,只要是最后一步操作即可
尾递归
函数调用自身,称为递归。如果尾调用自身,就称为尾递归
非常建议对阮一峰老师的ES6入门进行阅读;会有跟进一步对ES6的新特性的理解。