JS中的==运算符

最近看到一道题,如何声明a,从而确保a ==1 && a== 2 && a==3返回true,额,虽然一眼就可以看出a需要声明为一个对象,但是却不清楚应该使用什么方法属性了,由此暴露对于JS的==运算符带来的自动类型转换还是印象不深刻,于是重新学习下。

==的隐式类型转换

如果类型不同,需要考虑基本类型和对象类型

  • 基本类型
    • 数字与字符串,字符串会转换为数字
    • 数字与布尔,布尔会转换为数字
  • 对象类型
    • 如果其中一个是对象,则会调用对象的valueOftoString方法来尝试转化为基本类型值

当然,如果是===严格相等,不存在类型转换问题。

1
(a ==1 && a== 2 && a==3)===true

了解了类型转换规律,这道题就好解了

1
2
3
4
5
6
const a = {
i: 1,
valueOf: function () {
return a.i++;
}
};

总结

  • 这道题考查了类型隐式转换的知识,还是挺有意思
  • 实际开发中,我们往往使用严格相等===,同时eslint来约束该风格,避免出现意外情况。