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