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

标签 javascript ecmascript-5

考虑一下:

var a = {}, b = a;

在规范方面,b = a归结为 PutValue(b, GetValue(a)) , 正确的?和GetValue(a)使用 GetBindingValue("a", strictFlag)抽象操作,返回 a 中的“值” .而“值”是最初分配给a的“对象”。 .然后“对象”存储在b ,就像任何其他值一样。

但究竟什么是“对象”?规范在哪里说 Object 类型的值与基元的行为不同?仅仅是原语是不可变的,而对象是可变的吗?

我之所以问,是因为我们在尝试解释对象的行为时总是谈论“对象引用”和“引用值”,但我在规范中找不到与此类似的任何内容。

最佳答案

Where does the specification say that values of the Object type behave differently than primitives? Is it only that primitives are immutable, and objects are mutable?


是的,它基本上归结为对象的可变性,以及 identity of objects .实际上,这甚至没有在任何地方指定,它只是被假定为面向对象编程的给定核心思想。唯一提到它的是 Annex E 中的评论。 ,其中指出“任何测试此类文字值的对象身份或对共享副作用敏感的程序都可以检测到 [正则表达式文字表达式值] 的更改”。
甚至对象的可变性在任何地方都没有明确说明,但被短语暗示为“在 ECMAScript 中,状态和方法由对象携带”、“ECMAScript 对象是属性的集合”以及“改变”属性值的几个概念,“创建”属性或“设置”属性属性(在 [[DefineOwnProperty]] 方法中)。
更新 : PR#2821将介绍身份的概念并将对象描述为可变的。它可能会登陆 ES2023 :-)

I'm asking because we always talk about "object references" and "reference values" when trying to explain the behavior of objects, but I couldn't find anything analogous to that in the specification.


这是因为规范不是语言的指南,也不是对其特性的解释,而仅仅是对其(内部)特性的规范。希望读者了解 OOP 及其思想。
事实上,语言总是只谈论值——不管它是原始值还是对象。唯一可以被语言工具改变的东西是环境记录(变量)和属性对象的绑定(bind),其他所有东西(包括对象身份)都被隐式地认为是不可变的。
当我们试图解释“对象的行为”时,我们基本上解释了对象身份的概念。通常,观众来自较低级别的非 OOP 语言,默认情况下作业会复制,并且共享值是通过指针(引用)完成的。对他们来说,我们将对象解释为“ 对属性集合的引用 ”,并且对象的所有外观都是指向同一集合的引用。没有内置的方法来复制集合。
然而,为了强调通常没有引用1(不能引用标识符绑定(bind),即变量 - 无论其值的类型如何)并符合官方措辞,我们也使用术语 值(value) 一切。这为对象创造了术语“引用值”。
此外,Sameness 中的措辞/Equality Algorithm (s)匹配此:“其中 xy ,...,[当两者都是 Object 类型时],...,返回 true 如果 xy 引用 指向同一个对象。”

1. 实际上,规范描述了References作为 Specification Type .它们确实表示对象的属性,并用于描述 delete 的行为。 、属性赋值、方法调用等。但是它们不能被传递(赋值、函数调用),只能在内部传递,not obtainable , 并且不会指向变量。尽管如此,没有内置的方法来获取某种指向局部变量的指针。

关于javascript - 如何用 ECMAScript 术语解释对象引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23554770/

相关文章:

javascript - 将对象推送到数组并使用另一个对象作为属性

javascript - 获取用户位置并在数据库中保存坐标

typescript - 我可以在 {...} 中导入 ES5 导出的函数吗

javascript - 将 getter 和 setter 与 Object.defineProperty 一起使用

Javascript 在浏览器中获取和设置可用性

javascript - 根组件在路由器导出中呈现自己

javascript - (准确)从用户输入获取时间的首选方法(在 UiApp - GAS 中)

javascript - 如何让 Chrome 在新标签页中打开多个站点

javascript - 从矩对象中提取纪元

node.js:导出普通函数或箭头函数?