4

当向构造函数提供对象值时Object,该值将原封不动地返回。所以,给定一个对象obj

obj === new Object( obj )

obj === Object( obj )

那么,当初做的意义Object( obj )何在?我可以理解做Object( 'foo' ),或者Object( 123 )- 它为原始值创建一个包装对象,但如果我们已经有一个对象obj,我们为什么要这样做Object( obj )

这种模式没用吗?

4

2 回答 2

4

比较将检查是否obj是一个真实的对象。它几乎等同于检查

typeof obj == "object"

true然而,当我们尝试访问它的属性时,这也null可能导致奇怪的错误。因此,if (typeof obj == "object" && obj !== null)通常将其缩短为if (obj === Object(obj)).

此外,它true也会产生函数对象,而typeof测试不会产生 - 但有时您希望允许所有可以保存属性的东西,如果您忘记函数,有人会对您的库生气。

关于该模式,Reid 写了一个关于 内部结构的出色答案Object,它解释了您在问题中已经描述的行为。

于 2012-05-14T16:02:24.557 回答
2

假设这obj是一个 Object 值,它将没有效果。让我们看看 ES5 的规范(耶!)。

根据§ 15.2.1.1Object([value]),如果objis not nullor undefined,那么我们返回ToObject(value)

现在我们将注意力转向第 9.9 节 ToObject。它说如果参数是 Object 类型,“结果是输入参数(没有转换)。”

因此,没有理论上的理由使用Object(obj)where you know obj is an Object:它与 writing 完全相同obj

您列出的另一种情况是new Object(obj),这取决于§ 15.2.2.1new Object([value])。它表示如果value提供了并且类型value是对象,则返回obj如果obj是本机 ECMAScript 对象。如果它不是本机的,那么结果是实现定义的(因此在我看来,依赖于浏览器并且不推荐使用)。

于 2012-05-14T15:55:17.433 回答