【问题标题】:Is there an ES6+ alternative to doing Object.prototype.hasOwnProperty.call(obj, key)?Object.prototype.hasOwnProperty.call(obj, key) 是否有 ES6+ 替代方案?
【发布时间】:2017-07-20 13:09:22
【问题描述】:

检查对象是否具有特定键的最安全的方法是:

Object.prototype.hasOwnProperty.call(obj, key)

这提供了一定的保证:如果keyobj直接 属性,它只会评估为true,即使obj 没有通常将Object 作为其原型(例如,如果它是使用const obj = Object.create(null) 创建的)。

但它是一口。

在 ES6 或更高版本(包括 polyfillable 或 Babel 可编译的“提案”)中是否有任何新的语法/方法可以提供相同的保证,但以更好、更易读的方式?

【问题讨论】:

  • 为什么不用一个变量给它起别名呢?即const iHaz = Object.prototype.hasOwnProperty 然后像const iDoHaz = iHaz.call(obj, key) 一样使用它
  • 好吧,鉴于您几乎不需要使用它,有什么问题?
  • const has = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop) 是我通常使用的别名。
  • 我能想到的唯一可以缩短此时间的 ES Next 功能是绑定运算符,在这里它的胜利并不大:obj::Object.prototype.hasOwnProperty(key)
  • @callum 实际上我想你可以将它与 Bergi 的答案结合起来得到obj::({}).hasOwnProperty(key) 但这在可读性方面是一个损失,我不确定优先级是如何产生的,或者即使优先级绑定算子提案已经稳定。

标签: javascript


【解决方案1】:

我不知道这有什么语法糖。但是你不应该经常使用它1,所以偶尔写出来应该不会太糟糕。 equivalent shorter version 将是

({}).hasOwnProperty.call(obj, key)

如果你真的需要更频繁地使用它,只需定义一个辅助函数即可:

const hasOwn = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key);
const hasOwn = Function.prototype.call.bind(Object.prototype.hasOwnProperty);

1:在大多数情况下,您可以省略检查,改用in,或者应该使用Map 和舒适的has method

【讨论】:

    【解决方案2】:

    Object.hasOwn 已添加到对象标准 API。现在所有主流浏览器都支持它。

    【讨论】:

    • 除桌面 Safari 技术预览版外,在 Safari 上不受支持。但它可以是 polyfill。
    猜你喜欢
    • 1970-01-01
    • 2017-05-13
    • 2014-01-29
    • 2020-10-07
    • 2012-09-02
    • 2016-08-06
    • 1970-01-01
    相关资源
    最近更新 更多