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 }] = [{}, {}];
上面代码将一部分模式放在圆括号之中,导致报错。
可以使用圆括号的情况
可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号。