let和const

Let :不存在变量提升的 ``` function add(){ for (let i=0;i<5;i++){ console.log(i) } console.log(i) } ``` ``` function add() { for (var _i = 0; _i < 5; _i++) { console.log(_i); } console.log(i); } ``` 暂时性死区:使用let命令声明变量之前,该变量都是不可用的。 const :声明一个只读的常量。一旦声明,常量的值就不能改变 Const:只声明不赋值,就会报错。 ``` function add(){ for (const i=0;i<5;i++){ console.log(i) } console.log(i) } "use strict"; function _readOnlyError(name) { throw new Error("\"" + name + "\" is read-only"); } function add() { for (var _i = 0; _i < 5; _readOnlyError("i"), _i++) { console.log(_i); // 0 } console.log(i); } //VM445:1 Uncaught Error: "i" is read-only at _readOnlyError ( :1:39) at add ( :4:28) at :10:1 ``` Const 实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。 对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,`const`只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。 ``` const foo = { }; foo.my = 123 console.log(foo.my) foo.my =34; console.log(foo.my) ```

你可能感兴趣的:(let和const)