求教各位,问一个js原型相关的问题??

求教各位,问一个js原型相关的问题

function Fn() {}
var f = new Fn()
console.log(f.__proto__ == Fn.prototype)  // true
console.log(f.__proto__ == Object.getPrototypeOf(f))  // true
console.log(Fn.prototype == Object.getPrototypeOf(f))  // true
console.log(f.__proto__ == Fn.prototype == Object.getPrototypeOf(f))  // false

最后一行为啥是false呢? 他们之间都是互相相等的,但是放到一块比较就成了false是什么原因呢??giao!!! SOS

阅读 2.1k
5 个回答

这与原型无关console.log(f.__proto__ == Fn.prototype == Object.getPrototypeOf(f)) 这里前部分f.__proto__ == Fn.prototype是true 没有问题, 然后就是true == Object.getPrototypeOf(f)) 结果是false,

也就是说先得出f.__proto__ == Fn.prototype 的值 true 然后用这个值在进行==比较: true == Object.getPrototypeOf(f)), 当然就是false

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

要明白为什么最后一行的结果是false?你要清楚的知道一下几点:

  1. 在JavaScript中,比较运算符的优先级是从左到右。
  2. 在JavaScript中,比较运算符有两种:相等(==)和全等(===)。相等运算符会在比较前进行类型转换,而全等运算符不会。例如,1 == “1” 返回true,但1 === “1” 返回false。
  3. 在JavaScript中,比较运算符的结果是一个布尔值(true或false)。如果两个操作数的类型不同,那么相等运算符会尝试转换它们为恰当的类型再进行比较。

根据上述三点,分析可得:

从左到右:

f.__proto__ == Fn.prototype // true (比较f的原型对象和Fn的原型对象是否相等?)
true == Object.getPrototypeOf(f)) // false (布尔类型和f的原型对象是否相等?因为true和Object.getPrototypeOf(f)返回的对象类型不同(布尔型和对象型),所以JavaScript会尝试转换它们为相同类型再进行比较。)

运算符优先级顺序:==是从左到右的
根据运算符优先级来说最后一个式子会先运算f.__proto__ == Fn.prototype,结果为true
也就是说式子变成了true==Object.getPrototypeOf(f),结果自然就为false
最后建议你在判断对象之间是否相等时采用===严格相等符 能省去很多隐式转换带来的麻烦

这个问题和原型没有关系,本质还是 JavaScript 运行顺序问题 和 == 的隐式转换问题:
f.__proto__ == Fn.prototype == Object.getPrototypeOf(f)
等价于
(f.__proto__ == Fn.prototype) == Object.getPrototypeOf(f)
也就是
true == Object.getPrototypeOf(f)
也就是
true == Object.getPrototypeOf(f).toString()
也就是
true == '[object Object]'
最后
Number(true) == Number('[object Object]') =====>> 1 == NaN 为 false

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

这是因为虽然 f.__proto__ 和 Fn.prototype 和 Object.getPrototypeOf(f) 都指向同一个对象,但是使用 == 比较时,它们的类型不同,因此返回 false。具体来说,f.__proto__ 和 Fn.prototype 的类型都是 object,而 Object.getPrototypeOf(f) 的类型是 Fn.prototype。如果你使用 === 比较,它们的类型和值都相等,因此返回 true。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题