javascript 比较运算子 == , === 和 valueOf 的关系

为什麽 严格比较运算子 === 不会执行 Object.valueOf 而 一般 比较运算子 == 却执行 Object.valueOf ,MDN的文件在介绍 === 并没有看到相关的说明,请问关於这部份的文件要在哪里找到呢?

let num = 0;
const a = {
  valueOf: function() {
    ++num;
    return num;
  }
};

console.log(a == 1, a.valueOf());
// false 2 , a===1  ==> 比较时执行了 valueOf() 总共执行 2 次
console.log(a === 1, a.valueOf());
// false 3 , a===1  ==> 比较时没有执行 valueOf() 总共执行 1 次
阅读 1.8k
2 个回答

因为 ==运算符,比较对象和基础数据类型,对象会进行隐式转换为基础数据类型。(一般先valueOf后toString)
===运算符,如果两者数据类型不同,直接会返回false。
给你贴个文档地址

console.log(a === 1, a.valueOf());
// false 3 , a===1 ==> 比较时没有执行 valueOf()

这里其实是执行了valueOf()的,log内执行了一次。
console.log(a == 1, a.valueOf()); 在log内执行了两次。
两次log写在一起的话顺序执行,在谷歌浏览器看到的输出是

clipboard.png

至于为什么会执行两次,MDN有相关的提示

clipboard.png

所以 console.log(JSON.parse(JSON.stringify(a)) == 1, a.valueOf());
这样会友好一些。

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