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

在关于在JavaScript函数中传递参数的这个问题中,我们了解到所有东西都是通过JavaScript传递的。

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

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

所以,我在这个问题上给出了一个答案,基本上说这个区域没有定义。

我的问题

我觉得,我的意思是,“未定义的”并不是哲学上彻底清楚的,一个对象的价值是什么。 该标准经历了一些修订,其规模不断增加。

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


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


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

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

所以你把它传给一个对象,你得到同一个对象。

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


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

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

我们可以认为这是一个数据值是以下内容之一:

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


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

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

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

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

    用物理学的比喻来解释成员资格和个性之间的关系,我们看到太电子。 他们内容完全相同,都是宇宙的成员,但他们是两个不同的人。

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


    最后是标题中提到的问题。

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

    链接地址: http://www.djcxy.com/p/3535.html

    上一篇: Where is the mutability of Objects defined in ECMAScript?

    下一篇: What's the difference between a boolean as primitive and a boolean as property of an object?