我见过两种检测 UA 是否实现特定 JS 属性的方法:if(object.property)
和 if('property' in object)
。
我想听听关于哪个更好的意见,最重要的是,为什么。一个明显比另一个好吗?做对象属性检测的方法不止这两种吗?请涵盖浏览器支持、陷阱、执行速度等,而不是美学。
编辑:鼓励读者在 jsperf.com/object-detection 运行测试
最佳答案
if(object.property)
在未设置的情况下(这是您想要的)将失败,和在已将其设置为某个虚假值的情况下,例如
undefined
、null
、0
等(这不是您想要的)。var object = {property: 0}; if(object.isNotSet) { ... } // will not run if(object.property) { ... } // will not run
if('property' in object)
稍微好一点,因为它实际上会返回对象是否真的 具有该属性,而不仅仅是查看它的值。
var object = {property: 0}; if('property' in object) { ... } // will run if('toString' in object) { ... } // will also run; from prototype
if(object.hasOwnProperty('property'))
甚至更好,因为它可以让您区分实例属性和原型(prototype)属性。
var object = {property: 0}; if(object.hasOwnProperty('property')) { ... } // will run if(object.hasOwnProperty('toString')) { ... } // will not run
我想说性能在这里不是什么大问题,除非您每秒检查数千次,但在那种情况下您应该考虑另一种代码结构。最近的浏览器支持所有这些功能/语法,hasOwnProperty
也已经存在了很长时间。
编辑:您还可以创建一个通用函数来检查属性是否存在,方法是将任何东西(甚至不是对象的东西)作为对象传递,如下所示:
function has(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop);
}
现在可以了:
has(window, 'setTimeout'); // true
即使 window.hasOwnProperty === undefined
(在 IE 版本 8 或更低版本中就是这种情况)。
关于JavaScript 对象检测 : dot syntax versus 'in' keyword,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7174748/