gpt4 book ai didi

javascript - x.__proto__ == X.prototype 并不总是与 javascript 中的 x instanceof X 相同?

转载 作者:搜寻专家 更新时间:2023-11-01 00:12:34 25 4
gpt4 key购买 nike

我知道不应该在代码中直接使用 __proto__,但出于好奇,我在 node.js 中尝试了这个。我的印象是,如果 x.__proto__ == X.prototype 那么这意味着 x instanceof X 将产生 true 直到我点击这段代码具有原始值。

> (2).__proto__ ==  Number.prototype
true
> 2 instanceof Number
false
> (2) instanceof Number
false


> "abc".__proto__ == String.prototype
true
> "abc" instanceof String
false
> ("abc") instanceof String
false

这是为什么?

最佳答案

instanceof 如果左侧不是对象(参见 Step 3 here ),将始终产生 false

(2).__proto__ == Number.prototype 为真的原因是当您将属性访问器应用于基元时(在本例中为 .__proto__) , 一个具有相同底层原始值的临时对象被创建和使用。

因此,您从中获取 __proto__ 属性的东西与您在 instanceof 案例中使用的东西不同,因为它不是原始的.您的测试用例将更准确地是:

> (2).__proto__ == Number.prototypetrue> new Number(2) instanceof Numbertrue

I was under the impression that if x.__proto__ == X.prototype then it means x instanceof X will yield true

就目前情况而言,这是正确的(或者如果您使用 ===,出于一个相当模糊的原因1),但请注意,相反的情况并非如此true:如果 x instanceof X 为真,那并不一定意味着 x.__proto__ == X.prototype 为真,原因如下:

  1. 您可能需要使用 x.__proto__.__proto__,或 x.__proto__.__proto__.__proto__,或... :-)

  2. x.__proto__ 很可能是 undefined。例如,如果您像这样创建 x:x = Object.create(null)。原因是 __proto__ 属性访问器是由 Object.prototype 提供的,但是如果你创建一个不继承自 Object.prototype 的对象>,它没有 __proto__ 属性访问器(在兼容的实现上)。这是改用 Object.getPrototypeOf(x) 的原因之一。


1 相当晦涩的原因:如果 x 是通过 Object.create(null) 创建的(或使用任何不跟踪的原型(prototype)返回到 Object.prototype),因此没有 __proto__ 属性访问器,并且 X.prototypenullx.__proto__ == X.prototype 将是 true,即使它们很可能完全不相关,因为 x.__proto__ 将为 undefinedundefined == null 为真。 ;-)

关于javascript - x.__proto__ == X.prototype 并不总是与 javascript 中的 x instanceof X 相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41209948/

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