let&const

let基本用法

声明变量,类似var,但所声明的变量只在let命令所在代码块内有效

不存在变量提升

  • let不像var ,必须声明之后才可以使用,不会出现变量提升现象(即变量可以在声明完成之前使用)
    eg:
    let x;
    x=x //正常 undefined
    let x =x //ReferenceError
    var x=x //正常

暂时性死区(TDZ)

  • 区域中存在let/const命令,则这个区块对这些声明的变量,从一开始就形成了封闭作用域,只要在声明之前使用这些变量,就会报错。
    eg:
    var x=1,y=2,z=3;
    if (true) {
    //对于变量x和y TDZ开始
    console.log(z);//3
    console.log(x);//ReferenceError
    console.log(y);//ReferenceError
    let x,y;//TDZ结束
    }

不允许重复声明

  • let不允许在相同作用域内重复声明同一个变量
    eg:
    function(arg){
    let arg //ReferenceError;
    {
    let arg //不报错
    }
    }

const基本用法

const声明一个只读常量,一旦声明常量的值,就不能再更改
const PI=3.1415
PI=3 // 报错
const 声明常量,必须立即初始化,不能留到以后赋值
const PI//报错
const和let 相似,存在TDZ,不存在变量提升,不可重复声明

实质上,const声明的变量,指向的内存地址不变,对于简单类型的数据(数值,字符串,布尔值),值就存在内存地址中,而对于复合类型的数据(对象,数组),内存地址保存的是指针,也就是说 const声明的对象,只可以指向初始化的那个对象,不可指向其他对象了

注:如果你想将对象冻结:可以const foo = Object.freeze({});
绝对冰冻:
var constantize = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach( (key,i) => {
if( typeof obj[key] === 'object'){
constantize(obj[key]);
}
})
};

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