1.常量必须在声明的时候赋值,否则报错
const a = 1;//必须赋值
2.常量不能被修改, 但是!!为引用类型的时候,可被修改,const只能保证指向的引用地址不变,但是地址中的内容是可以改变的
//类型为对象
const xiaoming = {
age: 14,
name: '小明'
};
console.log(xiaoming);//{age:14,name:"小明"}
xiaoming.age = 22;
console.log(xiaoming);//{age:22,name:"小明"}
//类型为数组
const ARR=[];
ARR.push(1);
console.log(ARR);//1
3.Object.freeze()可防止引用类型被修改;
const xiaoming = {
age: 14,
name: '小明'
};
Object.freeze(xiaoming);//防止常量引用类型被修改
console.log(xiaoming);
xiaoming.age = 22;
xiaoming.dd = 11;
console.log(xiaoming);
const ARR = [];
Object.freeze(ARR);//防止常量引用类型被修改
ARR.push(1);
console.log(ARR);
const扩展
1.Object.defineProperty(对象名属性名{value:属性值 }):可添加、修改属性值也可扩展属性
var CST = {};
//给CST对象上修改/添加a属性并添加/修改它的value值叫小明
Object.defineProperty(CST, 'a', {
value:‘小明’
writable: false //a属性设为只读的不能被修改
});
2.Object.seal(对象名)对象不可扩展但可以修改现有属性
var CST = {a: 1};
Object.seal(CST);
3.Object.hasOwnProperty():可判断对象中是否有自身属性或方法
练习封装一个简单的freeze效果
// 1. 遍历属性和方法
// 2. 修改遍历到的属性的描述
// 3. Object.seal()
Object.defineProperty(Object, 'freezePolyfill', {
value: function(obj) {
var i;
for (i in obj) {
if (obj.hasOwnProperty(i)) { //判断i属性是否是自身的而不是原型上的属性
Object.defineProperty(obj, i, {
writable: false
});
}
}
Object.seal(obj);
}
});
const xiaoming = {
age: 14,
name: '小明',
obj: { //当属性的属性值又为对象时还是可修改通过上诉方法再次循环递归判断是否有自身的属性来封装
a: 1
}
};
Object.freezePolyfill(xiaoming);