为什么Object.prototype.hasOwnProperty.call(Number,“ toString”)返回false?

时间:2019-07-26 06:53:31

标签: javascript google-chrome ecmascript-6

https://eslint.org/docs/rules/no-prototype-builtinshttps://stackoverflow.com/a/12017703/14731暗示:

  • Object.prototype.hasOwnProperty.call(foo, "bar")等效于(并且比foo.hasOwnProperty("bar")更安全

但是在运行Chrome 75.0.3770.142时,我看到了:

  • Number.prototype.hasOwnProperty("toString") // true
  • Object.prototype.hasOwnProperty.call(Number, "toString") // false

问题:

  1. 这些不应该返回相同的值吗?
  2. 在这种情况下,假设我要处理的动态类型可能等于或不等于内置类型,我应该在哪里使用?

1 个答案:

答案 0 :(得分:2)

您实际上正在检查两个不同的内容:

  • true将检查userid对象的 prototype 是否包含Users属性,并且该属性不是来自其原型链(具有拥有财产)。
  • Number.prototype.hasOwnProperty("toString")Number基本相同-它不是{em> 检查原型,而是toString对象本身。

这是两个不同的对象,在这里可以看到:

Object.prototype.hasOwnProperty.call(Number, "toString")

因此,原型是包含Number.hasOwnProperty("toString")属性的内容,而Number则继承了该属性。因此,为了进行等效检查,您需要检查原型:

console.log(Number === Number.prototype)