let、const
1、ECMAScript 6
javascript组成: ECMAScript、BOM、DOM
ES6指的是ECMAScript的版本,2015年6月正式通过
2、let命令
用法类似于var,但是所声明的变量只在let命令所在的代码块内有效
var b = new Array()
for (let i = 0; i < 3; i++) {
b[i] = i
}
console.log(i)
报错:Uncaught ReferenceError: i is not defined
但是,换成var会正常输出 3
js作用域,不像其他大部分语言都是块作用域,它是函数作用域,只有函数里声明的变量才是局部变量,外部不能引用,而if、for等语句块中的变量,从声明开始直至销毁都是全局的。因此,有些地方使用var会觉得有点“坑”,增加了let命令之后,相当于给js增加了块级作用域,可以避免
var a = new Array() for(var i=0;i<6;i++){ a[i] = function(){ console.log(i) } } a[3](); //输出 6
上述代码中,i使用var声明的,并且是在语句块中,所以它是全局变量,每一次循环,变量的i值都会发生改变,而循环内的i指向的也是全局变量i,而执完循环体后,i的值为6,所以最后console.log(i)的输出也是6
var a = new Array() for(let i=0;i<6;i++){ a[i] = function(){ console.log(i) } } a[3]() //输出3
上述代码唯一的区别就是,i使用let声明。由于i是在块内起作用,也就是本次的循环中有效,所以每一次循环都会开辟一个新的地址存放,并且,js引擎会记住上一次的值,初始化本轮的变量i时,就会使用上一次i的值。所以最终输出的是 3
let无变量提升,也就是必须先声明再使用,否则会报错。ES6规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量从一开始就形成了封闭作用域。
let不允许在相同作用域内,重复声明同一个变量
3、const命令
const声明一个只读的常量。一旦声明,常量的值就不能改变。其本质是变量指向的地址不允许改动,针对数字、字符串、布尔值,值就保存在变量指向的内存地址,因此等同于常量,但对于复合类型的数据,主要是对象和数组,变量指向的内存地址是指针,其数据结构可以变。所以将对象或数组声明为const需要注意,其内容不一定是不变的。
const a; a = 11; console.log(a)
//输出报错 Uncaught SyntaxError: Missing initializer in const declaration
const常量,声明后必须赋值,并且对于简单的数据类型是不可以更改,但对于复杂数据类型,可以增减内容,但是不能改变地址
const a = 11; a = 12; console.log(a) //Uncaught TypeError: Assignment to constant variable. const b = {m:33} b.n = 22 console.log(b) // {m: 33, n: 22}
const c = [1,2,3,4];
let b = [1,2,3,4];
c = b;
console.log(c)
// Uncaught TypeError: Assignment to constant variable.