运到这样一道面试题,,一看很懵逼,再看很懵逼,来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