什么是deepFreeze和真正的可计量性之间的差异

时间:2018-06-15 13:07:46

标签: javascript object immutability

您好,先谢谢您。

我最近读过有关object.freez和deep.freez

的文章

考虑到js没有不可变的结构,我现在想知道这与standert的不变性这个术语有什么不同......

quote:如前所述,JavaScript没有不可变的结构,但可以通过原则和规则实现不变性。”

怎么看:code from :source

    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的任何信息

亲切的问候。

1 个答案:

答案 0 :(得分:4)

这两点都是正确的 - 在JavaScript中没有默认情况下不可变的数据结构。例如,您没有可以创建的数据结构,这是一个"不可变对象"在创作时。

但是,Object.freeze是JavaScript / ECMAScript规范中的一种方法,它在创建之后冻结对象的属性,基本上是制作它不可改变。

您的deepFreeze功能的核心是Object.freezedeepFreeze确保如果一个对象的属性也是一个对象,它也将被冻结。

您链接到的文章实际上提到了Object.freeze作为创建" immutable"的方法。对象。