ECMAScript中定义的对象的可变性在哪里?

时间:2017-07-29 10:54:07

标签: standards mutability

this question中关于JavaScript函数中参数的传递,我们了解到JavaScript中的所有内容都是通过值传递的。

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

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

所以,我在问题中给了answer,基本上说这个区域未定义。

我的问题

我觉得,“左未定义”,我的意思是,它在哲学上并不完全清楚,对象的价值是什么。该标准经过了一些修改,其规模不断扩大。

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

GetValue()不会忽略对象发生的事情 - 步骤#1是:

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

因此,你传递一个对象,你会找回同一个对象。

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

答案 2 :(得分:0)

参见5.1版本的4.3.26“属性”。说明说:

  

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

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

  1. 原始值:如C语言double,_ Bool,((void *)0)等。
  2. 一个对象:可以解释为一个特殊的C语言结构,包含有关该对象的底层信息。
  3. 函数对象:这只是2的特例,可能是JIT编译的结果。
  4. 这个关于属性定义的注释很重要的原因是因为,所有东西 - 甚至是功能块范围 - 都是对象(或者至少用一个对象来描述)。因此,如果我们可以确定“对象的价值”是其个性而不是其内容构成,则可以访问从JavaScript程序可访问的每个对象,就好像它是某个其他对象的属性一样。

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

      

    原始值是以下内置类型之一的成员:未定义布尔数字字符串;对象是剩余内置类型对象的成员;并且函数是可调用对象。

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

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

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

    因此,我们推断 - JavaScript对象的价值在于它的个性。

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

    单个对象的可靠性是根据一系列特定的伪函数定义的,其他类型的不变性是使用类型的值成员资格的定义和对基本类型值进行操作的规范伪函数来定义的。