ES6学习笔记-let和const命令

隐身守侯 提交于 2020-03-24 21:43:03

3 月,跳不动了?>>>

ES6简介

ECMAScript 6.0(简称 ES6)的第一个版本在 2015 年 6 月发布,正式名称就是《ECMAScript 2015 标准》(简称 ES2015),标准在每年的 6 月份都会发布一次,命名规则为:ES+年份,ES6涵盖了ES2015-ES2019的所有标准,因此ES6是一个历史名词,含义是 5.1 版(2011 年,ECMAScript 5.1 版发布)以后的 JavaScript 的下一代标准。

重要案例

此页面案例参考于:ECMAScript 6 入门

  1. ES6 规定let、const语句不出现变量提升,防止在变量声明前就使用这个变量,从而导致意料之外的行为。
var tmp = 123;
if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}

上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。(如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域)

  1. ES6的块级作用域
    ES5 只有全局作用域和函数作用域,let实际上为 JavaScript 新增了块级作用域。
// IIFE 写法
(function () {
  var tmp = 123;
  ...
}());
// 块级作用域写法
{
  let tmp = 123;
  ...
}

ES6 的块级作用域必须有大括号,如果没有大括号,JavaScript 引擎就认为不存在块级作用域。

// 第一种写法,报错
if (true) let x = 1;

// 第二种写法,不报错
if (true) {
  let x = 1;
}

上面代码中,第一种写法没有大括号,所以不存在块级作用域,而let只能出现在当前作用域的顶层,所以报错。第二种写法有大括号,所以块级作用域成立。

  1. const声明一个只读的常量。一旦声明,常量的值就不能改变。 const实际上保证的,并不是变量的值不得改动,而是变量指向的内存地址不可变。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,但对于复合类型的数据(主要是对象和数组),变量指向的内存地址只是一个指向实际数据的指针,const并不能保证它指向的数据结构是否可变,因此将一个对象声明为常量必须非常小心。
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
  1. 顶层对象的属性 var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。
var a = 1;
// 如果在 Node 的 REPL 环境,可以写成 global.a
// 或者采用通用方法,写成 this.a
window.a // 1
let b = 1;
window.b // undefined
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!