• const命令声明变量应注意的几点


    对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心。

    1 const person = {
    2      name : 'Tom',
    3      age : 18
    4 };
    5 person.age = 20;
    6 alert(person.age);

    上面的代码中,常量person存储的是一个地址,指向一个对象。不可变的只是这个地址,即不能把person指向另一个地址,但对象本身是可变的,所以其属性的值是可以修改的。

    下面是另外一个例子:

    1 const arr = [];
    2 arr.push(1);
    3 arr.push(2);
    4 alert(arr.length);
    5 arr.length = 0;
    6 alert(arr.length);

    上面的代码中,常量arr是一个数组,这个数组本身是可写的,但如果将另一个数组赋值给arr,就会报错。

    如果真的想把对象冻结,应该使用Object.freeze()方法。

    1 const person = Object.freeze({
    2      name : 'Tom',
    3      age : 18
    4 });
    5 person.age = 20;
    6 alert(person.age); //18

    上面的代码中,常量person指向一个冻结的对象,所以修改属性值不起作用。

    除了将对象本身冻结,对象的属性也应该冻结。下面是一个将对象彻底冻结的例子:

     1 var person =  {
     2      name : 'Tom',
     3      age : 18,
     4      friend : {
     5             name : 'Jerry',
     6             age : 19 
     7            }
     8      };
     9 var constantize = (obj)=>{
    10     Object.freeze(obj);
    11     Object.keys(obj).forEach((key,value)=>{
    12         if(typeof obj[key] === 'object'){
    13             constantize(obj[key]);
    14           }
    15        })
    16    };
    17 constantize(person);
    18 person.friend.age = 25;
    19 alert(person.friend.age); //19

    查看运行效果

  • 相关阅读:
    个人vim配置文件
    ORA-4031错误 解决方法
    HashMap在高并发下引起的死循环
    优先队列的应用
    java导入大量Excel时报错
    软件设计师必备——操作系统·
    Java Security安全系列文档翻译笔记————KeyStore、密钥、证书、命令行实战
    能变成有钱人的五个金玉良言(转)
    c3p0链接池
    js中获取键盘事件
  • 原文地址:https://www.cnblogs.com/yaotome/p/7285420.html
Copyright © 2020-2023  润新知