考虑一下:
var a = {}, b = a;
就规范而言,b = a
归结为PutValue(b, GetValue(a))
,对吧? GetValue(a)
使用GetBindingValue("a", strictFlag)
抽象操作,返回"值"在a
。并且"价值"是"对象"最初分配给a
。然后"对象"存储在b
中,就像任何其他值一样。
但是"对象"精确?规范在哪里说Object类型的值与原语的行为不同?只是原语是不可变的,对象是可变的吗?
我问,因为我们总是谈论"对象引用"和"参考值"当试图解释对象的行为时,我找不到与规范中类似的东西。
答案 0 :(得分:14)
规范在哪里说Object类型的值与原语的行为不同?只是原语是不可变的,对象是可变的吗?
是的,它基本上归结为对象的可变性和identity of objects。实际上,这甚至没有在任何地方指定,它只是假设为面向对象编程的给定核心思想。唯一提到它的是Annex E中的注释,其中指出" [正则表达式文字表达值] 的更改可被任何测试该程序的程序检测到这些文字值的对象标识或对共享副作用敏感的对象"。
即使对象的可变性在任何地方都没有明确说明,但短语暗示为&#34; 在ECMAScript中,状态和方法由对象承载&#34;,&#34; < em> ECMAScript对象是属性的集合&#34;和#34;改变&#34;的几个概念财产价值,&#34;创造&#34;属性或&#34;设置&#34;属性属性(在[[DefineOwnProperty]]方法中)。
我问,因为我们总是谈论&#34;对象引用&#34;和&#34;参考值&#34;在试图解释对象的行为时,我无法找到与规范中类似的任何内容。
那是因为规范不是语言的指南,而是对其特征的解释,而仅仅是对其(内部)特征的说明。读者应该了解OOP及其想法。
实际上,语言总是只讨论值 - 无论是原始值还是对象。语言工具可以改变的唯一事情是环境记录(变量)和属性对象的绑定,其他一切(包括对象标识)被隐式地认为是不可变的。
当我们试图解释对象&#34;的行为时,我们基本上解释了对象身份的概念。通常,受众来自较低级别的非OOP语言,默认情况下分配会复制,共享值由指针(引用)完成。对于他们,我们将对象解释为&#34; 引用到属性集合&#34;,并且对象的所有外观都是指向相同的引用采集。没有内置的方法来复制集合。
然而,强调缺少一般 1 中的引用(不能引用标识符绑定,即变量 - 无论它的值是什么类型)为了符合官方的措辞,我们还使用“强>值这一词来表示一切。这创造了术语&#34;参考值&#34;对象。
此外,Sameness / Equality Algorithm (s)中的措辞符合以下条件:&#34; 其中x
和y
值,...,[当两者都是Object类型时],...,true
如果x
和y
引用到同一个对象,则返回delete
&#34;
1.实际上,该规范将References描述为Specification Type。它们表示对象的属性,用于描述{{1}}的行为,属性赋值,方法调用等。但它们不能传递(赋值,函数调用),仅内部和not obtainable ,并且不会指向变量。但是,没有内置的方法来获取某种局部变量的指针。