重读ES6
let,const
一般认为,let和const是没有变量提升的,但是实际上“提升”仍然存在,只是通过暂时性死区抛错来引导用户进行规范的编码:
|
|
可以看到line:4访问的是外层全局变量,但由于block内的let声明,line:5执行前,tmp变量进入死区,对tmp的操作都会抛错
同时值得注意的是,从上古时期起,js全局变量和函数都会自动注册为window对象的属性(浏览器环境下),但浏览器环境是复杂多变的,引擎并不知道你的代码执行前window上有多么水深火热,所以很多检查只能放在runtime,这显然既不利于静态检查也容易造成很多莫名其妙的问题。于是从es6开始,委员会着手将es全局环境从window上分离,let和const声明的变量将不再自动注册window属性。
函数声明
- es5中函数只能在全局或block中声明,理论上在if表达式的花括号中声明函数是不允许的,但浏览器js引擎没有限制这种行为,这种情况下function关键词声明的函数会提升到上层作用域中,这种含糊不清的行为显然是一个潜在问题。
- es6则规定在block内声明的函数仅在该block作用域内,行为类似let(当然并不推荐这么做,各家浏览器实现上会有未知的差异,如有需要,请字面量声明)
数组的解构赋值
const [first, second] = someArray并不是数组的专利,Set()也是可以的,事实上,任何实现了Iterator接口的结构都能用中括号解构
字符串的解构赋值
没想到吧?!
- 使用中括号时字符串会作为类数组解构
- 使用花括号时字符串会作为具有length属性的对象进行解构
模板字符串
tagged template(标签模板):
|
|
似曾相识?又有点陌生? 喂,styled-components在么?
字符串的新方法(们)
- includes(searchString):返回布尔值,表示是否找到了参数字符串。
- startsWith(searchString):返回布尔值,表示参数字符串是否在原字符串的头部。
- endsWith(searchString):返回布尔值,表示参数字符串是否在原字符串的尾部。
- repeat(repeatTimes):返回一个新字符串,表示将原字符串重复n次。
- padStart(),padEnd():一共接受两个参数,第一个参数是字符串补全生效的最大长度,第二个参数是用来补全的字符串。
Math的新方法(们)
- Math.trunc():方法用于去除一个数的小数部分,返回整数部分。
- Math.hypot():√(A²+B²+…)
- Math.expm1():exp(x) - 1
- Math.log1p():log(1 + x)
- Math.log10():lg(x)
函数
函数的name属性会返回函数的函数名字符串,如果该函数是bind()返回值,则会带有bound前缀。 Function构造函数返回的函数实例,name属性的值为anonymous。
箭头函数
- 不可以当作构造函数,不可以使用new,否则会抛错。
- 不可以使用arguments对象,该对象在函数体内不存在。(扩展运算符,请)
- 不可以使用yield命令,因此箭头函数不能用作 Generator。 适合箭头函数的场景: 回调函数,this处理麻烦的地方 不适合箭头函数的场景: