JavaScript 对象检测:点语法与“in”关键字

2024-01-06

我见过两种检测 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(使用前将#替换为@)

JavaScript 对象检测:点语法与“in”关键字 的相关文章

随机推荐