【发布时间】:2013-02-25 06:40:47
【问题描述】:
我一直在对不同浏览器上不同库中的 isPlainObject 函数进行一些测试。
有 4 种不同的(代码方面的)isPlainObject 函数正在广泛的对象上进行测试:
- jquery
- lodash
- 实用程序(我正在开发的一个库)
- 替代方案,在下面的 cmets 中建议
以上所有四个都显示了 Chrome v23.0.1271.95 到 Chrome v25.0.1364.160、FireFox v 19.0 和 Opera v12.14 的差异,但实用程序至少对所有这些对象给出了相同的 false 响应浏览器
The tests on jsfiddle 在 Chrome 上运行时
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 构造函数创建的对象。
我知道宿主对象与使用“{}”或“new 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;
}
};
}())
});
【问题讨论】:
-
jquery 库文档前面说,这可能不适用于您正在测试的类型的对象:注意:主机对象(或浏览器主机环境用于完成 ECMAScript 执行环境的对象)具有许多难以稳健地检测跨平台特征的不一致。因此,在某些情况下,$.isPlainObject() 可能会在不同的浏览器中进行不一致的评估。
-
那么三个不同的代码库给出了 3 个不同的结果?也许是因为它们是不同的库,并且有不同的标准。
-
...这么说来,你要怎么定义一个普通的对象呢?
-
检查对象是否为普通对象(使用“{}”或“new Object”创建)。
-
您列出的标准并不是真正的标准。只有检查对象的某些方面才能尝试推断它是否是“普通对象”。目前没有内置方法。因此,每个人都有自己的判断标准,而且没有绝对完美的方法。
标签: javascript jquery javascript-objects lodash