WdBly Blog

懂事、有趣、保持理智

WdBly Blog

懂事、有趣、保持理智

周维 | Jim

603927378@qq.com

ES6 Let and Const

ES6中新的声明变量的两种方式,let和const

image.png

let和const的比较

let

1.只在当前作用域有效 作用域不会被提升 不能重复声明(和const相同)

{ console.log(a);//a is not defined; let a = "Hello World"; } console.log(a);//a is not defined; { let a = "Hello World"; let a = "Hello World"; } //Uncaught SyntaxError: Identifier 'a' has already been declared

由于let拥有块级作用域的特性,我们可以在闭包和循环中灵活的使用它。

2.暂时性死区(和const相同)

{ var a = "Hello World"; { console.log(typeof a); //a is not defined console.log(a); //a is not defined; let a = "Hello World"; let b = b; //x is not defined; } } { var a = 1; { console.log(a); //1 } }

在有let和const声明的作用域中,let和const声明的变量不能被提前使用,就算存在一个相同名称的全局变量也不行,就算是typeof也会抛出错误。暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

const

1.只在当前作用域有效 声明的变量不会被提升 不能重复声明(同let)

{ console.log(a);//a is not defined; const a = "Hello World"; } console.log(a);//a is not defined; { const a = "Hello World"; const a = "Hello World"; } //Uncaught SyntaxError: Identifier 'a' has already been declared

2.暂时性死区(同let)

{ var a = "Hello World"; { console.log(typeof a); //a is not defined console.log(a); //a is not defined; const a = "Hello World"; const b = b; //x is not defined; } }

3.声明的变量必须要有一个初始值

const name;//Missing initializer in const declaration

4.基本数据类型的值不能被修改

const name ="li"; name="wang";// Assignment to constant variable.

5.const定义的对象的属性可以修改

{ const obj={ name:"li" }; obj.name="zhou"; console.log(obj.name); //zhou }

因为对象是引用类型的,const定义的对象中变量保存的仅是对象的指针(对象在内存中的地址),当改变对象的某个属性时,对象的地址没有发生改变,这种改变是被允许的。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,值改变时内存地址也会改变。

{ const obj={}; obj.age = 18; console.log(obj.age); //18 const arr = [1,2,3]; arr.push(4); console.log(arr[3]); //4 arr.length = 0; console.log(arr); //[] }

同理,为对象增加或者移除属性,为数组push或删减元素都是被允许的。

更多详情请参考阮一峰老师写的ES6: http://es6.ruanyifeng.com/#docs/let