来自underscore.js的片段用于测试对象
_.isObject = function(obj) {
return obj === Object(obj);
};
这究竟是什么让它检查类型?
jsperf表明这比使用传统检查更快,这就是使用它的原因。
答案 0 :(得分:5)
Object构造函数为给定值创建一个对象包装器。如果值为null或未定义,则它将创建并返回一个空对象,否则,它将返回与给定值对应的类型的对象。
答案 1 :(得分:1)
我找不到相关的文档,但似乎Object
函数返回一个包装传入值的新对象,如果它已经是对象,则返回参数;否则,===
测试将始终返回false。
Object(5) === 5 // false, Object(5) creates Number object
Object(null) === null // false, Object(null) creates an empty object
var foo = { prop: 'value' };
Object(foo) === foo // true!? Argument is not wrapped
似乎此行为可用于测试值是否为对象。
<强>更新强>
这似乎是in the spec:
如果在没有参数或具有一个参数值的情况下调用Object函数,则执行以下步骤:
1.如果value为null,未定义或未提供,则创建并返回一个新的Object对象,就像使用相同的参数(15.2.2.1)调用标准的内置Object构造函数一样。 2.返回ToObject(值)。
ToObject的“结果是输入对象”is also defined in the spec。
答案 2 :(得分:1)
Object(obj)做什么?
阅读The Object
Constructor Called as a Function和abstract ToObject
operation上的EcmaScript规范。
当输入为非原始值(这究竟是什么让它检查类型?
Object(obj)
时, obj
将只生成strictly equal (===
)到null
的对象(即与输入相同的引用) ,布尔,字符串,数字,undefined
),即EcmaScript Object(包括字符串/布尔/数字/数组实例,函数,其他对象)。