ES6新特性 let&const

let

let 和 var 相同,是声明变量的关键字,而二者的区别也是很大

局部作用域

局部作用域是 let 的特性,只要是使用 let 声明的变量,就只能在当前局部作用域使用,而 var 声明的变量则可以在当前局部作用域外使用(函数作用域除外)

{
    var aaa = "hello world";
}
console.log(aaa); // "hello world"
{
    let bbb = "hello world";
}
console.log(bbb); // bbb is not defined

最常见的场景就是 for 循环

for(var a = 0; a < 10; a++){}
console.log(a); // 10

使用 var 声明循环变量,在循环外我们一样可以使用循环变量,这是因为上方代码相当于

var a;
for(a = 0; a < 10; a++){}
console.log(a); // 10

此时我们看到循环变量 a 被声明在了循环上方,这是因为使用 var 声明变量有变量提升,这个在后面会讲到。而使用 let 声明的变量不存在变量提升,所以在循环外无法使用

变量提升

let 声明的变量只能在声明之后使用,而 var 声明的变量这没有这个限制

console.log(aaa); // "undefined"
var aaa = "hello world";
console.log(aaa); // "hello world"

console.log(bbb); // bbb is not defined
let bbb = "hello world";
console.log(bbb); // "hello world" 这里只是给大家举例子,真实情况当然是在第一次打印就报错停止运行了

这是因为 var 拥有变量提升,我们每次用 var 声明变量,都相当于

var temp; // 这一行永远在作用域(Ps:这里要区分全局作用域和函数作用域)中所有代码之前,在代码中是不存在的
temp = "hello world"; // 这一行就是我们在代码中声明所在的位置

而 let 没有变量提升,所以 let 声明的变量只能在声明后使用

变量重名

var 是可以被重复声明的,而 let 同一个变量名,只能被声明一次

var aaa = "hello world";
var aaa = "hello world";

let bbb = "hello world";
let bbb = "hello world"; // Identifier 'bbb' has already been declared

const

const 作为 ES6 声明常量的关键字,同样拥有和 let 相似的特性,局部作用域、没有变量提升、变量不可重名,而它和 let 最大的不同就是 let 声明变量,const 声明常量

const aaa = "hello"
aaa = "world"; // Assignment to constant variable

对于 const 声明的常量,我们不能去改变他的值,所有基本数据类型都是相同的情况,下面我们来看一下引用数据类型

const obj = {
    name: "zhangsan"
}
obj.name = "lisi"; // 修改属性
obj.age = 18; // 添加属性
console.log(obj); // {name: "lisi", age: 18}

 对于引用数据类型只要指针不发生改变,对象中的属性、数组中的元素都可以随意添加、删除和修改

posted @ 2021-05-14 18:56  调用Function  阅读(100)  评论(0编辑  收藏  举报