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

Javascript 如何用ECMAScript术语解释对象引用?,javascript,ecmascript-5,Javascript,Ecmascript 5,考虑这一点: var a = {}, b = a; 就规范而言,b=a归结为PutValue(b,GetValue(a)),对吗?而GetValue(a)使用GetBindingValue(“a”,strictFlag)抽象操作,它在a中返回“值”。“值”是最初分配给a的“对象”。然后“对象”存储在b中,就像任何其他值一样 但“对象”究竟是什么?规范在哪里说对象类型的值的行为不同于原语?只是原语是不可变的,对象是可变的吗 我这样问是因为我们在试图解释对象的行为时总是谈论“对象引用”和“引用值”

考虑这一点:

var a = {}, b = a;
就规范而言,
b=a
归结为
PutValue(b,GetValue(a))
,对吗?而
GetValue(a)
使用
GetBindingValue(“a”,strictFlag)
抽象操作,它在
a
中返回“值”。“值”是最初分配给
a
的“对象”。然后“对象”存储在
b
中,就像任何其他值一样

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

我这样问是因为我们在试图解释对象的行为时总是谈论“对象引用”和“引用值”,但我在规范中找不到类似的东西

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

是的,它基本上归结为对象的易变性,以及。实际上,这甚至没有在任何地方指定,它只是假定为面向对象编程的一个给定核心思想。唯一提到它的是中的一条评论,该评论指出,“任何测试此类文本值的对象标识或对共享副作用敏感的程序都可以检测到[正则表达式文本表达式值]的更改”

即使对象的易变性在任何地方都没有明确说明,但通过“在ECMAScript中,状态和方法由对象携带”、“ECMAScript对象是属性的集合”以及“更改”属性值、“创建”属性或“设置”属性属性(在方法中)等短语来暗示

我这样问是因为我们在试图解释对象的行为时总是谈论“对象引用”和“引用值”,但我在规范中找不到类似的东西

这是因为规范不是该语言的指南,也不是对其特性的解释,而只是对其(内部)特性的规范。读者应了解OOP及其思想

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

当我们试图解释“物体的行为”时,我们基本上解释了物体同一性的概念。通常,受众来自较低级别的非OOP语言,在这些语言中,默认情况下,赋值是复制的,共享值是通过指针(引用)完成的。对于他们,我们将对象解释为“对属性集合的引用”,并且对象的所有外观都是指向同一集合的引用。没有内置的方法来复制集合

然而,为了强调一般1中缺乏引用(不能引用标识符绑定,即变量-无论其值的类型如何)并符合官方措辞,我们还使用术语value表示所有内容。这就为物体创造了“参考值”一词

此外,/中的措辞与此相匹配:“其中
x
y
值,…,[当两者都是Object类型时],…,如果
x
y
引用同一对象,则返回
true
。”


一,。实际上,该规范描述为一个。它们确实表示对象的属性,并用于描述
删除
的行为、属性赋值、方法调用等。但是,它们不能传递(赋值、函数调用),只是内部的,不会指向变量。尽管如此,仍然没有内置的方法来获取指向局部变量的某种指针