对象(o)的合法使用

时间:2012-05-14 15:47:29

标签: javascript theory

当向Object构造函数提供对象值时,该值将保持不变。所以,给定一个对象obj

obj === new Object( obj )

obj === Object( obj )

然后,首先要做Object( obj )的重点是什么?我能理解做Object( 'foo' )Object( 123 ) - 它为原始值创建了一个包装器对象,但是如果我们已经有了一个对象obj,为什么我们会Object( obj )

这种模式没用吗?

2 个答案:

答案 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不是nullundefined,那么我们会返回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。如果它不是原生的,那么结果是实现定义的(因此在浏览器中依赖于浏览器,不建议使用)。