ES6基础入门之const及ES6与ES6之前如何解决引用类型的常量可以被修改的问题

  1. const是常量-不可改变的量
  2. let、var是变量
  3. 常量必须在声明的时候赋值,否则报错:Missing initializer in const declaration

let类似的特性

声明的变量

  1. let声明的变量只在当前(块级)作用域内有效
  2. let或const声明的变量不能被重复声明
  3. let 不存在变量提升
  4. 最大的区别就是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大法秒啊~

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值