- const是常量-不可改变的量
- let、var是变量
- 常量必须在声明的时候赋值,否则报错:Missing initializer in const declaration
与let类似的特性
声明的变量
- let声明的变量只在当前(块级)作用域内有效
- let或const声明的变量不能被重复声明
- let 不存在变量提升
- 最大的区别就是const是常量
常量为引用类型的时候,不能保证不可变,那么
如何解决引用类型的常量可以被修改的问题
以下是可以成功修改的,因为此时并没有修改引用的地址
const xiaoming = {
age:14,
name:'小明'
};
console.log(xiaoming);
xiaoming.age = 22;
console.log(xiaoming);
以下是不成功的,因为此时已经修改了地址,而不是地址里的值
const xiaoming = {
age: 14,
name:'小明'
};
console.log(xiaoming);
xiaoming = {};
ES6有方便的解决方法,使用Object.freeze();使对象冻结,此时就不能被修改了。
const xiaoming = {
age:14,
name:'小明'
};
Object.freeze(xiaoming);
ES6之前怎么声明常量
//1.假装是常量
//var BASE_COLOR = '#ff0000';
往对象添加属性和描述,writable:false表示不能被修改,只读,这只能保证对象的某些属性不能被修改,不代表对象不能被扩展。
var CST = {};
Object.defineProperty(CST,'BASE_NAME',{
value:'小明',
writable:false
});
使用Object.seal();则可以防止对象被扩展,但是对象属性的value依然可以被修改。
Object.seal(CST);
可见以上两个方法结合使用可以使对象不能被修改。
因此可以封装一个方法来实现:
// 1.遍历属性和方法
// 2.修改遍历到的属性的描述
// 3.Object.seal()
Object.defineProperty(Object,'freezePolyfill',{
value:function(obj){
var i;
for(i in obj){
if(obj.hasOwnProperty(i)){
Object.defineProperty(obj,i,{
writable:false
});
}
}
Object.seal(obj);
}
});
//调用
var xiaoming = {
age:14,
name:'小明'
};
Object.freezePolyfill(xiaoming);
但依然解决不了以下情况的a的值可以被修改的问题
const xiaoming = {
age:14,
name:'小明',
obj:{
a: 1
}
};
因此,ES6大法秒啊~