let和const语法和区别

相似:

都是块级作用域

都不能和它所在作用域内的其他变量或函数拥有相同的名称

区别:

const声明的常量必须初始化,而let声明的变量不用

const 定义常量的值不能通过再赋值修改,也不能再次声明。而 let 定义的变量值可以修改。

1 为什么ES6要引入let和const(var命令所存在的问题)

1.1 变量提升

if (false) {

var a = 1

}

console.log(a)

正常理解上,if语句判定为false,var a = 1不会执行,最后 console.log(a)应该会报错才对,但实际结果为undefined。 导致这个结果的原因就是变量提升,上述代码可以理解为

var a

if (false) {

a = 1

}

console.log(a) // undefined

这样结果就显而易见了。

1.2 没有块级作用域

var funcs = []

for (var i = 0; i < 3; i++) {

funcs[i] = function () {

console.log(i);

};

}

funcs[0]() // 3

因为没有块级作用域,所以 i 泄漏为全局变量,funcs数组中方法所引用的变量 i 都是这一全局变量,导致函数并没有如预想的方式对变量i进行输出 0 1 2

1.3 可以重复声明

var a = 1

var a = 2

console.log(a) // 2

变量可以被重复的声明,可能会导致程序产生意想不到的bug

1.4 在全局作用域中声明的变量会创建为全局变量作为全局对象的属性

var a = 1

console.log(window.a) // 1

2 let和const与var的区别

引入let和const就是为了解决上述var所存在的问题,这也就两者之间的区别

不会进行变量提升

块级作用域

不可以重复声明

不会创建为全局对象的属性

可以使用上面的例子进行检测

3 let和const之间的区别

3.1 let声明的变量可以重新赋值,const声明的则不可以,所以const在声明变量时就一定要进行初始化

let a = 1

a = 2 // 2

const b = 1

b = 2 // Uncaught TypeError: Assignment to constant variable.

const声明不允许重新赋值,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动,但允许修改值。这意味着当用const声明对象时,对象的修改就是不可控的了。

你可能感兴趣的:(let和const语法和区别)