当向Object
构造函数提供对象值时,该值将保持不变。所以,给定一个对象obj
:
obj === new Object( obj )
和
obj === Object( obj )
然后,首先要做Object( obj )
的重点是什么?我能理解做Object( 'foo' )
或Object( 123 )
- 它为原始值创建了一个包装器对象,但是如果我们已经有了一个对象obj
,为什么我们会Object( obj )
?
这种模式没用吗?
答案 0 :(得分:4)
比较将检查obj
是否是真实对象。它几乎相当于检查
typeof obj == "object"
然而,true
也是null
,当我们尝试访问其属性时可能会导致奇怪的错误。因此,它不是写if (typeof obj == "object" && obj !== null)
,而是通常缩写为if (obj === Object(obj))
。
此外,它也为函数对象生成true
,而typeof
测试没有 - 但有时你想允许所有可以保存属性的东西,如果有人会对你的lib生气你忘记了功能。
关于这种模式,Reid写了一篇关于Object
内部的优秀答案,这解释了你在问题中已经描述过的行为。
答案 1 :(得分:2)
假设obj
是一个Object值,它将无效。让我们来看看ES5的规格(耶!)。
根据§ 15.2.1.1 Object([value])
,如果obj
不是null
或undefined
,那么我们会返回ToObject(value)
。
现在我们将注意力转向§ 9.9 ToObject。它说如果参数是Object类型,“结果是输入参数(没有转换)。”
因此,没有理论上的理由使用Object(obj)
知道 obj
是一个对象:它与编写obj
完全相同。< / p>
您列出的另一个案例是new Object(obj)
,这取决于§ 15.2.2.1 new Object([value])
。它表示如果提供value
并且value
的类型是Object,则如果obj
是本机ECMAScript对象,则返回obj
。如果它不是原生的,那么结果是实现定义的(因此在浏览器中依赖于浏览器,不建议使用)。