gpt4 book ai didi

javascript - ECMAScript 规范中的 `new Object` 与 `Object`

转载 作者:IT王子 更新时间:2023-10-29 03:06:26 26 4
gpt4 key购买 nike

因此,我正在查看 ES5 规范中关于 new ObjectObject 功能的定义。令我惊讶的是:

  • new Object 描述了对象构造函数如何工作的完整算法 - 处理不同类型的值所发生的情况。基本上在非对象上调用 ToObject - 对象上的标识并在 null 和 undefined 上构建。
  • Object 对于 null 和 undefined 有一个特殊的第一步,它构建一个对象,然后调用 ToObject 基元和对象的身份。

在阅读了几次描述之后 - 它们看起来相同。但是,从规范中可以清楚地看出它们有些不同。例如在 Array 中 - 调用 new Array 指定为 the function call Array(…) is equivalent to the object creation expression new Array(…) with the same arguments.`

那么 - new ObjectObject 有什么区别?为什么它们的指定方式不同?

为了方便 - 这是一个 link to the spec .

最佳答案

Object(window) 永远不会克隆 windownew Object(window) 可能。所有当前的——可能是所有已知的——实现都只返回相同的引用,尽管规范允许实现定义的行为。

15.2.1.1 的步骤说:

  1. If value is null, undefined or not supplied, create and return a new Object object exactly as if the standard built-in Object constructor had been called with the same arguments
  2. Return ToObject(value).

ToObject (9.9) 的定义列出了步骤 1 将捕获的几个类型(在表 14 中),但是对于 Object 有一个非常简单的定义:

The result is the input argument (no conversion).

它明确指出输入参数将按原样返回,因此它们应该是相等的引用 (===)。

new Object (15.2.2.1) 的定义在步骤 1 中有类似的类型检查链,但对象 (1.a) 的步骤是:

i. If the value is a native ECMAScript object, do not create a new object but simply return value.

ii. If the value is a host object, then actions are taken and a result is returned in an implementation-dependent manner that may depend on the host object.

也就是说,对于任何宿主对象 foo,调用 Object(foo) 必须 === foo 但是 new Object (foo) 可能 === foo

宿主对象在4.3.8中被定义为

object supplied by the host environment to complete the execution environment of ECMAScript.

This answer列出一些主机对象,包括 windowhistory 等。通过 new Object(foo) 运行这些对象应该 (但不一定)返回不同的对象。

在任何情况下但是传递一个宿主对象,new Object(foo) 似乎是一个更复杂的链,它遵循 ToObjectObject(foo) 非常相似。

不幸的是,15.2.2.1.1.a.ii 声明“结果以依赖于实现的方式返回”并且没有具体说明“已采取的行动”,而且 Chrome 似乎会返回所有列出的“宿主对象”的相同对象(相同的引用)。

使用此脚本检查:

var objects = [
/* Native objects */
'Object', 'Date', 'Math', 'parseInt', 'eval',
/* Host objects */
'window', 'document', 'location', 'history', 'XMLHttpRequest', 'setTimeout'
];

function getDefinedReference(name) {
if (eval('typeof ' + name) !== 'undefined') {
return eval(name);
} else {
throw new Error('' + name + ' is not defined.');
}
}

function checkIdentity(name) {
try {
var ref = getDefinedReference(name);
var no = new Object(ref);
var o = Object(ref);

console.log(name, ref === no, ref === o, no === o);

if (ref === o && no !== o) {
// Make sure ref === Object(ref) but not new Object(ref)
console.log(name, 'returns different references.');
}
} catch (e) {
console.warn(e);
}
}

objects.forEach(checkIdentity);

if (typeof window !== 'undefined') {
for (var f in window) {
checkIdentity(f);
}
}

没有找到任何 Objectnew Object 行为不同的对象。 @Xotic750 似乎是正确的,它可以依赖于实现,但没有人使用它。

关于javascript - ECMAScript 规范中的 `new Object` 与 `Object`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30801497/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com