1、let 和 const
(1)let:用来声明块级变量。
var声明的变量会出现作用域的提升(会出现变量的污染);
(2)const:声明的常量必须要初始化 ;
(3)const声明的对象:常对象
a. 可以修改对象的属性值,但是不能修改对象本身
b. 冻结对象:不能修改对象的属性。
使用冻结函数Object.freeze(对象名)
const obj = {
name:'Tom',
age: 25
};
console.log(obj);
Object.freeze(obj) //冻结对象obj后,就不能修改obj的属性
c. 冻结嵌套对象
如下定义嵌套对象
const per = {
name: 'Tom',
age: 23,
family: {
father: 'Tony',
mather: 'Jany'
},
};
//定义冻结函数
function fn(obj) {//通过参数传递对象给函数
Object.freeze(obj);
for (let key in obj) {//遍历对象obj的属性
//判断参数是否存在属性 key 并且key是否为一个对象类型
if (obj.hasOwnProperty(key) && typeof obj[key] === 'object') {
fn(obj[key]);//调用函数本身,冻结该属性
};
}
};
//调用冻结函数冻结对象
fn(per);
per.family.father = '张三';
console.log(per);//此时输出结果中属性已被冻结,并未被修改
上述冻结函数中用到了
hasOwnProperty(key)函数:判断key是否是对象的属性,若是返回true,不是返回false
2. 临时死区:用let和const声明的变量,放在‘临时死区’,
使用let声明的变量、const声明的常量的作用域不会被提升
ES5中var声明的变量在些许情况下会出现预期之外的错误
let arr = [];
for(var i = 0; i<5;i++){
arr.push(function(){//arr是一个函数数组:数组的每个单元都是函数
console.log(i);
});
};
//遍历数组arr
arr.forEach(function(item) {//item参数表示数组arr里的单元
//调用数组单元的函数
item();//由于var导致变量提升
});
因此控制台输出结果为: