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 (<anonymous>:1:39)
at add (<anonymous>:4:28)
at <anonymous>:10:1
Const 实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const
只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
const foo = {
};
foo.my = 123
console.log(foo.my)
foo.my =34;
console.log(foo.my)