let/const

2019-05-05  本文已影响0人  卡卡的尼奇

let/constES6新增的声明变量的关键词,和ES5var相比有以下几个特点

  1. 基本使用
  2. 块级作用域
  3. 不存在变量提升
  4. 不允许重复声明
  5. 暂时性死区

基本使用

let用于声明一个变量
const用于声明常量,const一旦声明之后,其值就不能修改,所以这就意味着const必须在声明的同时进行初始化

const a // Uncaught SyntaxError: Missing initializer in const declaration

const不能被修改的本质是保证了其声明的常量所指向的内存地址保存的数据不得改变,也就是说对于简单类型(指向的内存地址保存了值)值不得改变,对于引用类型(指向的内存地址保存了对象的引用)则是引用的对象不得改变为引用其他对象,被引用的对象本身是可以修改的

const a = 'a string'
a = 'a new string' // Uncaught TypeError: Assignment to constant variable.

const b = { name: 'Tom' }
b.age = '28'
console.log(b) // {name: "Tom", age: "28"}
b = { name: 'Jack' } // Uncaught TypeError: Assignment to constant variable.

在实际的项目中,常量声明使用const,好处是可以V8引擎对const有优化,而且可以避免不小心改变值。对于某些不可改变引用的对象,推荐也使用const进行约束

块级作用域

ES5中,js不存在块级作用域,

不存在变量提升

var存在变量提升,也就是可以先使用后声明,在声明之前使用时其值为undefined

console.log(`a = ${a}`) // a = undefined
var a = 5

console.log(`b = ${b}`) // Uncaught ReferenceError: b is not defined
let b = 5

不允许重复声明

在相同的作用域内,let/const不允许重复声明同一个变量

{
  var a = 5
  var a = `a string`
  console.log(a) // a string
}

{
  let a = 5
  let a = `a string` // Identifier 'a' has already been declared
}

暂时性死区

ES6明确规定,如果区块中存在let/const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

if (true) {
  // TDZ开始
  tmp = 'abc'; // ReferenceError
  console.log(tmp); // ReferenceError

  let tmp; // TDZ结束
  console.log(tmp); // undefined

  tmp = 123;
  console.log(tmp); // 123
}

由于死区会抛出异常,所以在项目中一定要先声明后使用

上一篇 下一篇

猜你喜欢

热点阅读