性能 - Object(obj)做什么?

时间:2013-04-11 17:51:19

标签: javascript underscore.js

来自underscore.js的片段用于测试对象

_.isObject = function(obj) {
    return obj === Object(obj);
  };

这究竟是什么让它检查类型?

jsperf表明这比使用传统检查更快,这就是使用它的原因。

3 个答案:

答案 0 :(得分:5)

  

Object构造函数为给定值创建一个对象包装器。如果值为null或未定义,则它将创建并返回一个空对象,否则,它将返回与给定值对应的类型的对象。

Source

答案 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 Functionabstract ToObject operation上的EcmaScript规范。

  

这究竟是什么让它检查类型?

当输入为非原始值(Object(obj)时,

obj将只生成strictly equal (===)null的对象(即与输入相同的引用) ,布尔,字符串,数字,undefined),即EcmaScript Object(包括字符串/布尔/数字/数组实例,函数,其他对象)。