4

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

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

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

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

4

3 回答 3

5

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

资源

于 2013-04-11T17:53:51.577 回答
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

这种行为似乎可以测试一个值是否是一个对象。

更新

看来这是在规范中

当没有参数或只有一个参数值调用 Object 函数时,将采取以下步骤:
1. 如果 value 为 null、未定义或未提供,则创建并返回一个新的 Object 对象,就像标准的内置 Object 构造函数一样已使用相同的参数 (15.2.2.1) 调用。
2. 返回对象(值)。

并且 ToObject 的“结果是输入对象”也是在 spec 中定义的

于 2013-04-11T18:06:26.167 回答
1

对象(obj)做什么?

阅读关于作为函数调用的Object构造函数抽象ToObject操作的 EcmaScript 规范。

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

Object(obj)仅当输入是非原始值(、布尔值、字符串、数字时,即EcmaScript===对象(包括String /Boolean/数字/数组实例、函数、其他对象)。objnullundefined

于 2013-04-13T14:53:14.813 回答