【问题标题】:Where is the mutability of Objects defined in ECMAScript?ECMAScript 中定义的对象的可变性在哪里?
【发布时间】:2018-01-05 09:41:29
【问题描述】:

this question 关于 JavaScript 函数中的参数传递中,我们了解到 JavaScript 中的一切都是按值传递的。

Mozilla documents 中提到原始类型是不可变的,而对象是。虽然我来自过程和结构化编程学校,但我能够快速掌握这些概念。

在 ECMAScript 标准中,定义“一个对象是‘逻辑上’属性的集合”。该标准还定义了如何比较对象,但忽略了当对象通过将引用转换为值的 GetValue() 伪函数时会发生什么。

所以,我在问题中给出了answer,基本上是说这个区域没有被定义。

我的问题

我觉得“未定义”的意思是,在哲学上并没有完全清楚对象的价值是什么。该标准经过多次修订,规模不断扩大。

简而言之,一个对象就是一个集合,但是这个集合的价值是什么?是其内容的构成吗?还是个性?还是我错过了一些重要的文本?

【问题讨论】:

    标签: standards mutability


    【解决方案1】:

    在 ECMAScript 规范中,每个对象都被定义为具有某些“内部方法”,其中一些(例如,[[DefineOwnProperty]] 和 [[Put]])可以改变对象的状态。最终,对象的可变性是通过使用此类内部方法来定义的。

    【讨论】:

      【解决方案2】:

      GetValue() 不会遗漏对象会发生什么——第 1 步是:

      If Type(V) is not Reference, return V.

      因此,如果您将对象传递给它,您将返回相同的对象。

      (这反驳了你的一个前提,但我不确定它是否能解决你的问题。)

      【讨论】:

      • 不,当您在语言中使用标识符时,它始终是引用。请参阅第 11.1.2 节“标识符参考”。
      • 如果您指的是“评估标识符的结果始终是引用类型的值。”,这并不能反驳我所说的。
      【解决方案3】:

      请参阅 5.1 版的第 4.3.26 节“属性”。笔记上写着:

      根据属性的形式,值可以直接表示为数据值(原始值、对象或函数对象),也可以通过一对访问函数间接表示。

      我们可以认为这意味着数据值是以下之一:

      1. 原始值:如C语言double、_Bool、((void*)0)等
      2. 一个对象:可以解释为一种特殊的 C 语言结构,其中包含有关该对象的底层信息。
      3. 函数对象:只是2的特例,可能是JIT编译的结果。

      这个关于属性定义的注释很重要的原因是,一切——甚至是功能块范围——都是对象(或者至少是用一个来描述的)。因此,如果我们可以确定“一个对象的价值”是它的个性而不是它的内容构成,那么从 JavaScript 程序中访问的每个对象都可以被访问,就好像它是某个其他对象的属性一样。


      在第 4.2 节“语言概述”中,它说:

      原始值是以下内置类型之一的成员:UndefinedNullBooleanNumber 字符串;一个对象是剩余的内置类型 Object 的成员;一个函数是一个可调用的对象。

      虽然这是一个非正式的部分,但可以看出对象与原始值有很大不同。

      作为一种解释,让我们考虑一个对象的值是对象本身,因为我们可以从“GetValue()”伪函数中推断出——概述说“一个对象是 ... 类型 Object 的成员——因此,值是 Object 类型的成员资格。

      用物理学类比来解释成员和个体之间的关系,我们也看到了电子。他们在内容上是相同的,他们都是宇宙的成员,但他们是两个不同的个体。

      因此,我们推断——一个 JavaScript 对象的价值,就是它的个性。


      最后关于标题中提出的问题。

      单个对象的可变性是通过一系列规范的伪函数来定义的,而其他类型的不变性是使用类型的值成员关系的定义和对原始类型值进行操作的规范伪函数来定义的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-17
        • 1970-01-01
        • 1970-01-01
        • 2013-09-13
        • 2019-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多