ES6相关知识(一)

96 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第23天,点击查看活动详情

let与var和const的区别?

let为ES6新添加申明变量的命令,它类似于var,但是有以下不同:

  • let命令不存在变量提升,如果在let前使用,会导致报错
  • let命令不允许重复声明,不可以在相同作用域中重复声明同一个变量
  • 不属于顶层对象window,顶层对象跟全局挂钩,污染全局变量,
  • 暂时性死区的本质,其实还是块级作用域必须 “先声明后使用” 的性质。
  • let,const和class声明的全局变量不是全局对象的属性。
  • const声明的变量与let声明的变量类似,它们的不同之处在于,const声明的变量只可以在声明时赋值,不可随意修改,否则会导致SyntaxError(语法错误)。
  • const声明的变量不存在提升,const命令声明的变量只在声明所在的块级作用域内有效。
  • const只是保证变量名指向的地址不变,并不保证该地址的数据不变。const可以在多个模块间共享 let 暂时性死区的原因:var 会变量提升,let 不会。

箭头函数

箭头函数不属于普通的 function,所以没有独立的上下文。箭头函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。 由于箭头函数没有自己的this,函数对象中的call、apply、bind三个方法,无法"覆盖"箭头函数中的this值。 箭头函数没有原本(传统)的函数有的隐藏arguments对象。 箭头函数不能当作generators使用,使用yield会产生错误。

在以下场景中不要使用箭头函数去定义:

  • 定义对象方法、定义原型方法、定义构造函数、定义事件回调函数。
  • 箭头函数里不但没有 this,也没有 arguments, super ……

Object.is() 与原来的比较操作符“ ===”、“ ==”的区别?

两等号判等,会在比较时进行类型转换;

三等号判等(判断严格),比较时不进行隐式类型转换,(类型不同则会返回false);

Object.is 在三等号判等的基础上特别处理了 NaN 、-0 和 +0 ,保证 -0 和 +0 不再相同,

但 Object.is(NaN, NaN) 会返回 true.

Object.is 应被认为有其特殊的用途,而不能用它认为它比其它的相等对比更宽松或严格。