let、const是es6新提出的定义变量的方法。let已经被广泛使用,它能弥补var在使用上的某些不足。
1.var
- var的作用域是全局作用域与函数作用域(局部)
- var声明的变量,可修改变量值,可重新声明
var v2 = 1;
var v2 = 2;
console.log(v2); /*2,var可被重复声明*/
- 使用var定义的变量,会自动变成window对象的属性,不管在全局作用域与局部作用域内都是。let、const不会
var v2 = 2;
console.log(window.v2); /*2,var全局变量自动添加window变量的属性*/
let v3 = 1;
console.log(window.v3); /*undefined*/
- var的提升时,声明与函数被提到作用域顶部,并对变量赋undefined的初始值。
function func() {
console.log(name);
var name = 'fkit';/*var name提前并赋初始值,输出undefined*/
console.log(name);
}
3. let
-
let作用域是块级作用域,{ }大括号内就是一块,仅在当前块中有效;
- let定义的变量可以被修改,但是在同一个作用域中无法被多次定义,
let v1 = 1;
v1 = 2; /*修改变量的值*/
console.log(v1); /*2,一个作用域内可被修改*/
let v1 = 3;
console.log(v1); /*报错,一个作用域内不能重复声明*/
在不同的作用域中可定义相同的变量 ,互不干扰。因为他们是在不同的作用域内。
let v1 = 1;
console.log(v1); /*1*/
if (v1 === 1) {
let v1 = 2;
console.log(v1); /*2*/
}
- let 的变量提升.let的声明也会被提升到作用域顶部,但是不会进行undefined赋值。若不赋值就使用会报错
function func() { console.log(name); /*未提前声明name,报错*/ let name = 'fkit'; console.log(name); } func();
3. const
- const是块级作用域
- const 不能被修改并且不能被重新声明,相当于定义了一个常量。
const v4 = 1;
v4 = 3;/*试图修改值*/
console.log(v4);/*报错*/
const v4 = 1;
const v4 = 2;
console.log(v4); /*报错*/
- 都说const定义的值不能修改,其实应该是定义的值的地址不能被修改。因为当const定义了复杂数据类型时,还能去操作他的元素。
当使用const定义对象的时候,可以使用对象名.属性 = 属性值的方式修改对象的属性值。
const obj = {
times: 4,
};
obj.times = 5;
- const的变量提升,与let一样,提升到作用域顶部,但不初始化。定义不赋值就使用会报错