let 与 var的区别
在ES6中,新增了let来声明变量,那么它与var有什么区别呢?
-
作用域不一样:用var声明变量,只有函数作用域和全局作用域,没有块级作用域,也就是说可以在代码块{}中使用,而let可以实现块级作用域,用let声明的变量,只能在{}中使用,在{}外部不能使用,
-
let没有变量提升:ES6规定,如果区块中含有let和const(定义常量)命令,这些区块对这些命令声明的变量,从一开始就形成了封闭作用域,凡在声明之前使用,就会报错,一句话,在代码块中,在用let声明变量之前,该变量是不可用的。这在语法上,称为“暂时性时区”(temporal dead zone,简称TDZ)
-
let变量不能重复声明:用var声明变量,比如定义了a = 1,重复定义a = 2,此时a = 2就会覆盖a = 1,而let不会,用let声明过的变量,不能在被声明
-
循环作用域:在for循环中,不仅{}会产生块级作用域,()也会生成块级作用域,()作用域是{}作用域的父级作用域,var声明的变量,包括循环体内和循环体外,而let声明的变量作用域只在循环体内,循环体外的变量不受影响
const常量的声明
const声明一个只读变量,声明之后不能改变,意味着,一旦声明,必须初始化,而且不能被重新赋值和重新声明
用const声明常量,一般使用大写字母,关于上文的“暂时性死区”,同样适用于const,
看上图,为什么NAME不能改变,而ARR可以改变呢?因为NAME是字符串,是基本数据类型;而ARR是数组,是引用数据类型,引用数据类型使用const声明时,只要保证内存地址不变就行了。看下图:
因为ARR的地址变了,所以就报错了