您好,先谢谢您。
我最近读过有关object.freez和deep.freez
的文章考虑到js没有不可变的结构,我现在想知道这与standert的不变性这个术语有什么不同......
“quote:如前所述,JavaScript没有不可变的结构,但可以通过原则和规则实现不变性。”
function deepFreeze(object) {
// Retrieve the property names defined on object
var propNames = Object.getOwnPropertyNames(object);
// Freeze properties before freezing self
for (let name of propNames) {
let value = object[name];
object[name] = value && typeof value === "object" ?
deepFreeze(value) : value;
}
return Object.freeze(object);
}
var obj2 = {
internal: {
a: null
}
};
deepFreeze(obj2);
obj2.internal.a = 'anotherValue'; // fails silently in non-strict mode
obj2.internal.a; // null
我现在有点困惑了
我认为不可变性意味着在创建bean之后无法改变(更改)对象的值。而且据我所知,deep.freez完全达到了......那么有什么不同呢?
希望这个问题有意义,因为我无法找到有关deep.freez的任何信息
亲切的问候。
答案 0 :(得分:4)
这两点都是正确的 - 在JavaScript中没有默认情况下不可变的数据结构。例如,您没有可以创建的数据结构,这是一个"不可变对象"在创作时。
但是,Object.freeze
是JavaScript / ECMAScript规范中的一种方法,它在创建之后冻结对象的属性,基本上是制作它不可改变。
您的deepFreeze
功能的核心是Object.freeze
。 deepFreeze
确保如果一个对象的属性也是一个对象,它也将被冻结。
您链接到的文章实际上提到了Object.freeze
作为创建" immutable"的方法。对象。