【问题标题】:How do I make a JavaScript variable completely immutable?如何使 JavaScript 变量完全不可变?
【发布时间】:2019-07-23 20:14:16
【问题描述】:

我听说过类似的问题,但不是我想要的答案; 我不算 const 因为: 1)。 它实际上并没有使它不可变,它只是使引用不可变 2)。 它与范围混淆,我也希望它在块外工作 3)。 并非所有浏览器都支持它

 {
     const hello = ["hello", "world"];
     hello.push("!!!");
     console.log(hello);//outputs "hello", "world", "!!!"
 }
 //and it doesn't, and shouldn't, work here
     console.log(hello);

【问题讨论】:

标签: javascript immutability var


【解决方案1】:

只需使用Object.freeze

const immutableArray = Object.freeze([1,2,4])

【讨论】:

  • 谢谢,但这仅适用于对象!它如何适用于任何数据类型?
  • const name = Object.freeze(<anything>) 工作得很好。 <anything> 可以是数组、对象、数字、字符串、布尔值或其他任何东西。在浏览器中试一试。
  • 是的。对不起,我错过了你的评论。但是是的,Object.freeze 接受任何引用类型。请记住,几乎所有东西都是 js 中的对象(除了原语)
  • @Dupocas 不是数组、字符串、布尔值、数字等原语吗?尽管如此,它确实对任何事情都有效,但现在我考虑一下这将毫无意义:Object.seal(4) 例如
【解决方案2】:

您可以为此使用Object.freeze(显然仅在objects 上使用)。

const hello = Object.freeze(["hello", "world"]);

// hello.push("!!!");
// will throw "TypeError: can't define array index property past the end of an array with non-writable length"

// hello.length = 0;
// will fail silently

// hello.reverse();
// will throw "TypeError: 0 is read-only"

// hello[0] = "peter";
// will fail silently

来自 MDN:

Object.freeze() 方法冻结object。无法再更改冻结的对象;冻结对象可防止向其添加新属性、删除现有属性、防止更改现有属性的可枚举性、可配置性或可写性,并防止更改现有属性的值。此外,冻结对象还可以防止其原型被更改。 freeze() 返回传入的同一个对象。

但是,如果不对变量的值使用Object.freezeObject.seal,则没有关键字可以定义完全不可变的变量。

对于限制较少的方法,Javascript 也有 Object.seal()

【讨论】:

    【解决方案3】:

    不使用 const 的方法是使用 Object.defineProperty,就像我想要的那样,它在范围方面的行为类似于 var

    {
        Object.defineProperty(typeof global === "object" ? global : window, "PI", {
            value:        Object.seal(3.141593),
            enumerable:   true,
            writable:     false,
            configurable: false
        });
    }
    console.log(PI); // 3.141593
    

    唯一的问题是它不会在严格模式之外抛出错误。

    【讨论】:

      猜你喜欢
      • 2013-03-05
      • 2022-01-01
      • 1970-01-01
      • 2023-04-11
      • 2017-05-14
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多