使 if (a == '1' && a == '2' && a == '3')为true,弱比较规则

246 阅读1分钟

运到这样一道面试题,,一看很懵逼,再看很懵逼,来get一get

先上答案吧

<script>

  // 方法一
  var a = {
      i: 1, toString() {
          return a.i++;
      }
  };
  // 方法二
  var a = [1, 2, 3];
  console.log(a.shift);
  a.join = a.shift;
  if (a == 1 && a == 2 && a == 3) {
      console.log(1);
  }
</script>

思路

==的比较规则

=== :是严格比较,不存在任何的类型转换,而== 是弱比较,存在隐式转换。
= = 就是把两侧的值转为基本数据类型再进行比较(Number/String/Boolean),如果两边的比较类型不同时,将两边的值转换为数字,再比较值。

第一种方法

打印出a看看 对象转化成数字,如果对象有valueOf的方法,调用并返回相应结果。如果调用valueOf后任然不是数字,则用toString,并返回相应结果。
当对象与1弱比较时就调用我们给的valueOf或者toString方法。

第二种

打印出来的a

数组,数组也是一样的。数组的toString:默认会调用join方法拼接每个元素并且返回拼接后的字符串

console.log ( [ 1, 2, 3 ] == "1,2,3" );//true 
//(1)[1,2,3].toString() == '1,2,3' 
//(2)'1,2,3' == '1,2,3'

我们给join方法赋了shift