第一章
第二章——let、const
let
只在let所在的代码块中有效
不存在变量提升
console.log(a);// 报错 a is not defined
let a = 0 ;
暂时性死区
显式
function f(){
// a死区开始
console.log(a)
let a = 1;// a死区结束
}
隐式
function f( x = y , y = 1 ){
// y变量在为声明前就调用了y赋值给x。
// 由于死区问题,所以会报错
}
不允许重复声明
相同作用域下
const
常量,声明赋值后不能再改变。
声明时必须赋值,否则报错
- 暂时性死区
- 不允许重复声明
- 只在当前代码块中有效
本质
const声明保存的是内存地址,所以就是指针不能变化。
对于基本类型来说,符合常量这个意思
对于引用类型来说,只能保存所指的对象地址,而不能保存对象中的属性的地址变动
const obj={}
obj.name='gem'
console.log(obj.name);// 'gem'
真正冻结一个对象Object.freeze()
// 循环冻结
var constantize = (obj)=>{
Object.freeze(obj);
Object.keys(obj).forEach((key,i)=>{
if(typeof obj[key] === 'object'){
constantize(obj[key]);
}
})
}