2

在 ECMAScript 2021 语言规范的术语和定义部分,普通对象定义为:

具有所有对象必须支持的基本内部方法的默认行为的对象

标准对象定义为:

其语义由本规范定义的对象

看完这两个定义后,我立刻问自己,“所有对象必须支持的基本内部方法的默认行为不也在本规范中定义了吗?”

我已经尝试在规范中搜索这两个术语,但“普通对象”有 100 多个匹配项,而“标准对象”只有少数引用,它们没有提供额外的上下文来明确这些术语之间的区别我。我也尝试过谷歌搜索,但结果似乎与我的问题无关。

普通对象和标准对象有什么区别?区分这两种类型的对象很有用的场景示例是什么?

4

2 回答 2

2

是的,每一个普通的物体也是一个标准的物体。

术语普通对象奇异对象形成对比,后者确实具有内部对象方法的非默认实现。标准外来对象的示例是代理、数组和绑定函数。

术语标准对象(以前也称为“本地对象”,这导致了很多混淆)与宿主对象实现定义的对象形成对比,后者由不同的规范(例如 HTML5)指定或在引擎中实现没有正式的规范。console.log这些可以是具有主机定义的调用行为(例如,setTimeout等)或完全陌生的对象(document.all、节点列表等)的函数(否则是普通的) - 请参阅Web API以了解浏览器定义的对象的概述。其他环境将提供其他主机定义的对象。

我猜,存在由宿主实现或非 ECMAScript 标准控制的普通对象(具有标准的默认行为)可能被归类为两者之一。

仅供参考,与此术语讨论相关的最后一个区别是内置对象称为内置对象)和用户定义对象之间的区别。前者由启动时的实现创建,提供用户代码可以与之交互的环境。后者由用户代码在运行时构建。不幸的是,当外来对象由本机(非用户)代码构建时,它确实变成了一个灰色区域,这些有时也被称为“内置”。

另请参阅本机对象和宿主对象有什么区别?在 ECMAScript 中,一些原生对象是如何内置的?.

于 2022-01-02T18:27:39.130 回答
1
 const user = { firstname: "Jonas" };

那是一个普通的对象(因为它不是外来对象),但它不是标准对象,因为语义是由我定义的,而不是由规范定义的。但是,它的行为是指定的(例如user.firstname将评估为"Jonas")。

于 2022-01-02T16:09:24.703 回答