JavaScript 对象检测 : dot syntax versus 'in' keyword

标签 javascript properties

我见过两种检测 UA 是否实现特定 JS 属性的方法:if(object.property)if('property' in object)

我想听听关于哪个更好的意见,最重要的是,为什么。一个明显比另一个好吗?做对象属性检测的方法不止这两种吗?请涵盖浏览器支持、陷阱、执行速度等,而不是美学。

编辑:鼓励读者在 jsperf.com/object-detection 运行测试

最佳答案

  • if(object.property)

    在未设置的情况下(这是您想要的)将失败,在已将其设置为某个虚假值的情况下,例如undefinednull0 等(这不是您想要的)。

    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/

相关文章:

javascript - 如何识别javascript不可删除的属性?

c# 如何使用 Property

ios - 如果我想给自己分配一个属性怎么办?

php - 如何用 PHP 读取文件属性?

javascript - 动态添加的类上的事件

javascript - 将 onclicklistener 重新附加到按钮

javascript - 选择框全屏 jquery bootstrap

javascript - 根据页面宽度 javascript 更改 CSS?

c# - 如何在c#中将类的静态变量作为参数传递

javascript - Chart.js,更改最大高度(不带 Canvas )或向上舍入规则?