Featured image of post 重读ES6

重读ES6

重读ES6

let,const

一般认为,let和const是没有变量提升的,但是实际上“提升”仍然存在,只是通过暂时性死区抛错来引导用户进行规范的编码:

1
2
3
4
5
6
var tmp = 123;

if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}

可以看到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(标签模板):

1
2
3
const name = 's0urce'
const tag = (...arg) => console.log(arg)
tag`There must be something ${name} can do.`

似曾相识?又有点陌生? 喂,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处理麻烦的地方 不适合箭头函数的场景:
Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计