我一直在对不同浏览器上不同库的 isPlainObject 函数进行一些测试。
有 4 个不同的(代码方面的)isPlainObject 函数正在广泛的对象上进行测试:
- jQuery
- 罗达什
- 实用程序(我正在研究的一个库)
- 替代方案,在下面的评论中建议
以上所有四个都显示了 Chrome v23.0.1271.95 到 Chrome v25.0.1364.160、FireFox v 19.0 和 Opera v12.14 的差异,但实用程序至少在所有浏览器上对这些对象给出了相同的 false 响应
在 Chrome 上运行时对 jsfiddle 的测试
Failed to agree: JSON - jquery: true - utility: false - lodash: true - alt: false
Failed to agree: Math - jquery: true - utility: false - lodash: true - alt: false
Failed to agree: top - jquery: false - utility: false - lodash: true - alt: true
Failed to agree: parent - jquery: false - utility: false - lodash: true - alt: true
- true 是例程认为对象是普通的,而 false 不是普通的
编辑:我相信所有的例程都使用以下类似的标准:
jquery states
检查对象是否为普通对象(使用“{}”或“new Object”创建)。
lodash states
检查给定值是否是由 Object 构造函数创建的对象。
我知道宿主对象与使用“{}”或“新对象”构造的对象不同,所以我想我的问题是:宿主对象应该算作普通对象吗?
目前,实用程序是一致的并且说它们不是,其他例程为不同浏览器上的主机对象给出不同的结果。
编辑:结果的准确性对我来说是最重要的因素,性能是次要的考虑因素。
jsperf上提供了 3 个库的性能结果和建议的替代方案
编辑:这是实用程序库函数,因此您无需搜索代码。
defineProperty(utility, "isPlainObject", {
value: (function () {
var o = {};
return function (obj) {
try {
return utility.isObject(obj) && getPrototypeOf(obj).isPrototypeOf(o);
} catch (e) {
return false;
}
};
}())
});