当向构造函数提供对象值时Object
,该值将原封不动地返回。所以,给定一个对象obj
:
obj === new Object( obj )
和
obj === Object( obj )
那么,当初做的意义Object( obj )
何在?我可以理解做Object( 'foo' )
,或者Object( 123 )
- 它为原始值创建一个包装对象,但如果我们已经有一个对象obj
,我们为什么要这样做Object( obj )
?
这种模式没用吗?
当向构造函数提供对象值时Object
,该值将原封不动地返回。所以,给定一个对象obj
:
obj === new Object( obj )
和
obj === Object( obj )
那么,当初做的意义Object( obj )
何在?我可以理解做Object( 'foo' )
,或者Object( 123 )
- 它为原始值创建一个包装对象,但如果我们已经有一个对象obj
,我们为什么要这样做Object( obj )
?
这种模式没用吗?
比较将检查是否obj
是一个真实的对象。它几乎等同于检查
typeof obj == "object"
true
然而,当我们尝试访问它的属性时,这也null
可能导致奇怪的错误。因此,if (typeof obj == "object" && obj !== null)
通常将其缩短为if (obj === Object(obj))
.
此外,它true
也会产生函数对象,而typeof
测试不会产生 - 但有时您希望允许所有可以保存属性的东西,如果您忘记函数,有人会对您的库生气。
关于该模式,Reid 写了一个关于 内部结构的出色答案Object
,它解释了您在问题中已经描述的行为。
假设这obj
是一个 Object 值,它将没有效果。让我们看看 ES5 的规范(耶!)。
根据§ 15.2.1.1Object([value])
,如果obj
is not null
or 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 对象。如果它不是本机的,那么结果是实现定义的(因此在我看来,依赖于浏览器并且不推荐使用)。