繁体   English   中英

如何使 JavaScript 变量完全不可变?

[英]How do I make a JavaScript variable completely immutable?

我听过类似的问题,但不是我想要的答案; 我不计算 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);

只需使用Object.freeze

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

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

 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()

没有 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM