【问题标题】:Why object const can be changed after definition in JavaScript?为什么在 JavaScript 中定义后可以更改对象 const?
【发布时间】:2019-12-29 03:49:22
【问题描述】:

在 JavaScript 中:

const a = 6;
a = 2; // Error

const o = {};
o = 7; // Error
o.a = 5; // Good. Why?

const o = {a:1};
o.a = 2; // Good. Why?

我发现人们有时会定义一个 const 对象,但后来会更改它的值。为什么 const 定义后可以更改?

【问题讨论】:

  • 改变对象的属性并不会改变对象本身
  • 你不能重新分配一个常量——你不能改变它的引用。您可以它所引用的底层事物,例如添加对象属性。您正在寻找冻结对象

标签: javascript constants


【解决方案1】:

const 声明的变量意味着一件事独立变量名以后不能用= 重新分配。

相比之下,o.a = 5; 并没有重新分配变量名称 - 它改变了对象的内容,但它没有改变 o 变量在内存中指向的内容。

要防止重新分配变量名,请使用const。防止对象的变异是完全不同的——为此,您需要类似Object.freeze 或使用immutable-js 操作对象。

【讨论】:

    【解决方案2】:

    在第一种情况下,aconst,不能重新分配。在第二个和第三个中,对象oconst,因此不能为对象分配另一个值,但它的属性不是const。见这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const

    const 声明 创建对值的只读引用。它确实意味着它持有的值是不可变的,只是变量标识符不能被重新分配。例如,在内容是对象的情况下,这意味着可以更改对象的内容(例如,它的属性)。

    【讨论】:

      【解决方案3】:

      const 变量并未强制为不可变。

      来自MDN

      常量是块范围的,很像使用 let 语句定义的变量。 常量的值不能通过重新赋值来改变,也不能重新声明

      强调我的。

      o.a = 5 没有重新分配o;它正在重新分配 o 中的属性。

      【讨论】:

        【解决方案4】:

        如果要定义常量对象属性,请从其他答案中添加更多信息。你可以试试这些方法:

        const o = {
          get a() {
            return 1;
          }
        };
        
        o.a = 2;
        
        // 1
        console.log(o.a);
        
        const o2 = {};
        
        Object.defineProperty(o2, 'a', {
          value: 1,
          writable: false,
          enumerable: true,
          configurable: true
        });
        
        o2.a = 2;
        
        // 1
        console.log(o2.a);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-14
          • 2022-08-11
          • 2020-04-15
          • 1970-01-01
          • 2019-05-09
          • 2010-10-01
          • 1970-01-01
          相关资源
          最近更新 更多