ES6补充

103 阅读2分钟

var与let的区别:

1.var变量的提升,let不会

  • var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined。 let命令则不同,它所声明的变量一定要在声明后使用,否则报错。` // var 的情况 console.log(ar); // 输出undefined var ar = 512;

// let 的情况 console.log(et); // 报错ReferenceError let et = 512; `上面代码变量ar用var声明,会发生变量提升,因没有值,所以会输出undefined。变量et用let声明的则不会发生变量提升。

2.let不允许重复声明 var可以

  • let 可以被修改但是不能被重新声明. 就像 var 一样,用 let 声明的变量可以在其范围内被修改。但与 var 不同的是,let 变量无法在其作用域内被重新声明。 来看下面的例子: let greeting = 'say Hi'; greeting = 'say Hello instead'; 上面的代码将会返回一个错误: let greeting = 'say Hi'; let greeting = 'say Hello instead'; // error: Identifier 'greeting' has already been declared. 但是,如果在不同的作用域中定义了相同的变量,则不会有错误。

3.let存在块级作用域

  • let和var的区别体现在作用域上。var的作用域被规定为一个函数作用域,而let则被规定为块作用域,块作用域要比函数作用域小一些,但是如果两者既没在函数中,也没在块作用域中定义,那么两者都属于全局作用域。

4.let存在暂时性死区

  • ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。(使用const声明的是常量,在后面出现的代码中不能再修改该常量的值。)

在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”。

变量的解构赋值

不能使用圆括号的情况:

(1)变量声明语句

let [(a)] = [1];

let {x: (c)} = {};
let ({x: c}) = {};
let {(x: c)} = {};
let {(x): c} = {};

let { o: ({ p: p }) } = { o: { p: 2 } };

上面 6 个语句都会报错,因为它们都是变量声明语句,模式不能使用圆括号。

(2)函数参数

函数参数也属于变量声明,因此不能带有圆括号。

function f([(z)]) { return z; }
function f([z,(x)]) { return x; }

(3)赋值语句的模式

// 全部报错
({ p: a }) = { p: 42 };
([a]) = [5];

上面代码将整个模式放在圆括号之中,导致报错。

[({ p: a }), { x: c }] = [{}, {}];

上面代码将一部分模式放在圆括号之中,导致报错。

可以使用圆括号的情况 

可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号。