gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:53:40 27 4
gpt4 key购买 nike

我见过两种检测 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com