Javascript 深度冻结和真实适用性之间有什么区别

Javascript 深度冻结和真实适用性之间有什么区别,javascript,object,immutability,Javascript,Object,Immutability,您好,提前谢谢您 我最近读到关于object.freez和deep.freez的文章 考虑到js没有不变的结构,我现在想知道这与不变的标准项有什么不同 “:正如前面所说,JavaScript没有不可变的结构,但不可变性可以通过原则和规则来实现。” 你有没有见过: 我现在有点困惑了 我认为不变性意味着在创建对象后不能对其值进行变异(更改)。据我所知,deep.freez确实做到了。。。那么有什么区别呢 希望这个问题有意义,因为我找不到任何关于deep.freez的信息 这两点都是正确的——Java

您好,提前谢谢您

我最近读到关于object.freez和deep.freez的文章

考虑到js没有不变的结构,我现在想知道这与不变的标准项有什么不同

“:正如前面所说,JavaScript没有不可变的结构,但不可变性可以通过原则和规则来实现。”

你有没有见过:

我现在有点困惑了

我认为不变性意味着在创建对象后不能对其值进行变异(更改)。据我所知,deep.freez确实做到了。。。那么有什么区别呢

希望这个问题有意义,因为我找不到任何关于deep.freez的信息


这两点都是正确的——JavaScript中没有默认不变的数据结构。例如,您无法创建在创建时是“不可变对象”的数据结构

但是,在JavaScript/ECMAScript规范中,是一种方法,它在对象创建后冻结对象的属性,本质上使其不可变

您的
deepFreeze
函数的核心是调用
Object.freeze
deepFreeze
确保如果一个对象的属性也是一个对象,那么它也将被冻结


您链接到的文章实际上提到了
Object.freeze
作为创建“不可变”对象的方法。

这两点都是正确的-JavaScript中没有默认不可变的数据结构。例如,您无法创建在创建时是“不可变对象”的数据结构

但是,在JavaScript/ECMAScript规范中,是一种方法,它在对象创建后冻结对象的属性,本质上使其不可变

您的
deepFreeze
函数的核心是调用
Object.freeze
deepFreeze
确保如果一个对象的属性也是一个对象,那么它也将被冻结


你链接到的文章实际上提到了
Object.freeze
作为一种创建“不可变”对象的方法。

引用是不正确的,而且一直是(链接到5.1,但
Object.freeze
在2009年出现在[pdf]中,只是没有正式作为可链接的HTML提供)。引用是不正确的,一直是错误的(该链接是指向5.1的,但2009年[pdf]中出现了
Object.freeze
,只是没有正式的可链接HTML)@LostDemondragon我已经更新了我的答案,以提供更多的上下文。没有功能上的区别,但您链接的文章在技术上是正确的,因为JS中没有默认不可变的数据结构。但是,一旦您调用
Object.freeze
,那么无论出于何种目的,它都是不可变的。@LostDemondragon-the quote是不正确的。属性值都是只读原语或对冻结对象的只读引用的冻结对象是不可变的。JavaScript并不是为不可变而设计的,但从2009年起,它就已经具备了不可变性。2015年和即将到来的2018年规范提供了进一步的工具,以实现更好的以不可变性为中心的编程,尽管它是仍然不是(也可能永远不会是)JavaScript的默认模式。字符串在默认情况下是不可变的。@ttarik ahhh“JavaScript中没有默认不可变的数据结构。”…这就是我需要的…非常感谢:3我会的,除了你的答案…祝你有美好的一天。非常感谢。@LostDemondragon我更新了我的答案以提供更多的上下文。没有功能上的区别,但是你链接的文章在技术上是正确的,因为JS中没有默认不变的数据结构。一次您可以调用
Object.freeze
,因此无论出于何种目的,它都是不可变的。@LostDemondragon-这个引号是不正确的。一个属性值都是只读原语或对冻结对象的只读引用的冻结对象是不可变的。JavaScript并不是为不可变而设计的,但从200年开始它就有了不可变性9.2015年和即将到来的2018年规范提供了进一步的工具,以实现更好的以不变性为重点的编程,尽管它仍然不是(也可能永远不会是)JavaScript的默认模式。默认情况下字符串是不可变的。@ttarik ahhh“JavaScript中没有默认不可变的数据结构。”…这就是我所需要的…非常感谢:3除非你回答我,否则我会的…祝你有一个美好的一天。非常感谢。
    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