如何解释ECMAScript术语中的对象引用?

bfa*_*tto 18 javascript ecmascript-5

考虑一下:

var a = {}, b = a;
Run Code Online (Sandbox Code Playgroud)

就规格而言,b = a归结为PutValue(b, GetValue(a)),对吧?并GetValue(a)使用GetBindingValue("a", strictFlag)抽象操作,返回"值" a.而"价值"是最初分配给的"对象" a.然后存储"对象" b,就像任何其他值一样.

但究竟什么是"对象"呢?规范在哪里说Object类型的值与原语的行为不同?只是原语是不可变的,对象是可变的吗?

我问,因为我们在尝试解释对象的行为时总是谈论"对象引用"和"引用值",但我找不到与规范中类似的东西.

Ber*_*rgi 14

规范在哪里说Object类型的值与原语的行为不同?只是原语是不可变的,对象是可变的吗?

是的,它bascially归结为对象的可变性,以及身份的对象.实际上,这甚至没有在任何地方指定,它只是假设为面向对象编程的给定核心思想.唯一提到的是附件E中的评论,其中指出" [正则表达式文字表达值] 的变化可由任何测试这些文字值的对象身份或对共享副作用敏感的程序检测到 " .

即使对象的可变性在任何地方都没有明确说明,但短语暗示为" 在ECMAScript中,状态和方法由对象承载 "," ECMAScript对象是属性的集合 "和几个"改变"属性值的概念,"创建"属性"或"设置"属性属性(在[[DefineOwnProperty]]方法中).

我问,因为我们在尝试解释对象的行为时总是谈论"对象引用"和"引用值",但我找不到与规范中类似的东西.

这是因为规范不是语言的指南,而是对其特征的解释,而仅仅是对其(内部)特征的说明.读者应该知道OOP及其想法.

实际上,语言总是只讨论值 - 无论是原始值还是对象.语言工具可以改变的唯一事情是环境记录(变量)和属性对象的绑定,其他一切(包括对象标识)被隐式地认为是不可变的.

当我们试图解释"对象的行为"时,我们基本上解释了对象身份的概念.通常,受众来自较低级别的非OOP语言,默认情况下分配会复制,共享值由指针(引用)完成.对他们来说,我们解释的对象作为" 参考的属性集合 ",和对象的所有外观都指向同一集合引用.没有内置的方法来复制集合.

但是,为了强调一般情况下缺少引用1(一个不能引用标识符绑定,即一个变量 - 不管它的值是什么类型)并且符合官方的措辞,我们也使用术语来表示一切.这为对象创造了术语"参考值".

此外,在该措词的趋同/平等算法(S)相匹配这样的:" 在那里xy,...,[当两者都Object类型],...,返回true如果xy 相同的对象. "


实际上,规范将参考文献描述为规范类型.它们确实表示对象的属性,并用于描述delete属性赋值,方法调用等的行为.但它们不能传递(赋值,函数调用),仅内部且不可获取,并且不会指向变量.但是,没有内置的方法来获取某种局部变量的指针.