我见过两种检测 UA 是否实现特定 JS 属性的方法:if(object.property)
and if('property' in object)
.
我想听听关于哪个更好的意见,最重要的是,为什么。其中一个明显优于另一个吗?除了这两种方法之外还有其他方法可以进行对象属性检测吗?请涵盖浏览器支持、陷阱、执行速度等,而不是美观。
Edit:鼓励读者在以下位置运行测试jsperf.com/对象检测 http://jsperf.com/object-detection/6
-
if(object.property)
如果未设置(这正是您想要的),则会失败,and如果它被设置为一些错误的值,例如undefined
, null
, 0
等等(这不是你想要的)。
var object = {property: 0};
if(object.isNotSet) { ... } // will not run
if(object.property) { ... } // will not run
-
if('property' in object)
稍微好一点,因为它实际上会返回对象是否really拥有财产,不能只看它的价值。
var object = {property: 0};
if('property' in object) { ... } // will run
if('toString' in object) { ... } // will also run; from prototype
-
if(object.hasOwnProperty('property'))
甚至更好,因为它允许您区分实例属性和原型属性。
var object = {property: 0};
if(object.hasOwnProperty('property')) { ... } // will run
if(object.hasOwnProperty('toString')) { ... } // will not run
我想说性能在这里并不是一个大问题,除非您每秒检查数千次,但在这种情况下您应该考虑另一种代码结构。所有这些函数/语法均受最新浏览器支持,hasOwnProperty https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/hasOwnProperty#See_also也已经存在很长时间了。
Edit:您还可以创建一个通用函数,通过将任何内容(甚至不是对象的内容)作为对象传递来检查属性是否存在,如下所示:
function has(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop);
}
现在这有效:
has(window, 'setTimeout'); // true
even if window.hasOwnProperty === undefined
(IE 版本 8 或更低版本就是这种情况)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)