underscore.js 中用于测试对象的片段
_.isObject = function(obj) {
return obj === Object(obj);
};
究竟是什么让它检查类型?
jsperf 表明这比使用常规检查更快,这就是使用它的原因。
underscore.js 中用于测试对象的片段
_.isObject = function(obj) {
return obj === Object(obj);
};
究竟是什么让它检查类型?
jsperf 表明这比使用常规检查更快,这就是使用它的原因。
Object 构造函数为给定值创建一个对象包装器。如果值为 null 或未定义,它将创建并返回一个空对象,否则,它将返回一个与给定值对应的类型的对象。
我找不到相关文档,但似乎该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 中定义的。
对象(obj)做什么?
阅读关于作为函数调用的Object
构造函数和抽象ToObject
操作的 EcmaScript 规范。
究竟是什么让它检查类型?
Object(obj)
仅当输入是非原始值(、布尔值、字符串、数字)时,即EcmaScript===
对象(包括String /Boolean/数字/数组实例、函数、其他对象)。obj
null
undefined