规范在哪里说 Object 类型的值的行为与基元不同?仅仅是基元是不可变的,而对象是可变的吗?
是的,它bascially归结为对象的可变性,以及身份的对象。实际上,这甚至没有在任何地方指定,它只是假设为面向对象编程的一个给定核心思想。唯一提到的是附件 E 中的评论,其中指出“任何测试此类文字值的对象身份或对共享副作用敏感的程序都可以检测到[正则表达式文字表达式值]的变化” .
甚至在任何地方都没有明确说明对象的可变性,但用短语暗示“在 ECMAScript 中,状态和方法由对象携带”,“ ECMAScript 对象是属性的集合”以及“改变”属性值的几个概念,“创建”属性或“设置”属性属性(在[[DefineOwnProperty]]方法中)。
我问是因为在试图解释对象的行为时我们总是谈论“对象引用”和“引用值”,但我在规范中找不到任何类似的东西。
那是因为规范不是语言的指南,也不是对其功能的解释,而只是对其(内部)特征的规范。希望读者了解 OOP 及其思想。
事实上,语言总是只讨论值——不管它是原始值还是对象。唯一可以被语言工具改变的东西是环境记录(变量)和属性对象的绑定,其他所有东西(包括对象标识)都被隐式地认为是不可变的。
当我们试图解释“对象的行为”时,我们基本上是在解释对象身份的概念。通常受众来自较低级别的非 OOP 语言,其中赋值默认进行复制,共享值由指针(引用)完成。对他们来说,我们解释的对象是“引用的属性集合”,和对象的所有线路均被引用指向同一个集合。没有内置的方法来复制集合。
然而,为了强调一般1缺乏引用(不能引用标识符绑定,即变量 - 无论其值的类型如何)并符合官方措辞,我们也使用术语值来表示一切。这创造了对象的术语“参考值”。
此外,Sameness / Equality Algorithm (s)中的措辞与此匹配:“ wherex
和y
are values , ..., [when both are type Object], ..., return true
if x
and y
reference the same object. ”
1. 实际上,规范将引用描述为规范类型。它们确实表示对象的属性,用于描述的行为delete
、属性赋值、方法调用等。但是它们不能传递(赋值、函数调用),仅在内部且不可获得,并且不会指向变量。尽管如此,仍然没有内置的方法来获取某种指向局部变量的指针。