从 (a==1&&a==2&&a==3) 成立中看javascript的隐式类型转换

几天上班看到一个题目就是

if( a == 1 && a == 2 && a ==3){
    console.log("a等于什么才会输出这一句话呢?");
}

当a为什么的时候输出:a等于什么才会输出这一句话呢??

当时我一看我觉得a应该要为一个数组,因为只有是数组才可以一下可以有很多选择,但其实 没那么简单,那么我们先从一些简单的写法看看

1.在群里的写法一

var a = eval(console.log("a等于什么才会输出这一句话呢?"));

直接写了eval的这个方法?就可以输出了(eval方法中参数的值会运行),可能很多人和我一样不是很了解这个方法,也确实用的不多一般也就是在json转换的时候用下,单也其实用的也不多,那我们随便说下他的用法

eval的参数为:语句或一系列语句的字符串。表达式可以包含变量以及已存在对象的属性

eval的返回值为:执行指定代码之后的返回值。如果返回值为空,返回undefined,如上面a就是undefined;

所以上面的写法还可以是

var a =  eval("console.log(" + " \"a等于什么才会输出这一句话呢? \" " +")");
var a = eval('console.log("a等于什么才会输出这一句话呢?")');

好了eval()的介绍就讲到了这里,想看具体的用法的去MDN看下吧

好了看了上面的方法心里一句mmp,这个好像不是我们所需要的,明白大家需要什么下面我们来看下更加厉害的写法

运算是对象时候的valueOf toString 方法

扫描二维码关注公众号,回复: 5776996 查看本文章
const a = {
  i: 1,
  toString: function () {
    return a.i++;
  }
}

if(a == 1 && a == 2 && a == 3) {
  console.log('Hello World!');
}

如果原始类型的值和对象比较,对象会转为原始类型的值,再进行比较。(我想到的也是这种方法),对象转换成原始类型的值,算法是先调用valueOf方法;如果返回的还是对象,再接着调用toString方法。我们每次比较时候都会执行方法返回 a 的 i 属性同时也改变 i 的值,所以上面 if执行完以后 a 的 i 属性已经变为了 4,这里也表现出了 == 比较是有可能会对变量带来副作用的

利用数组的特性

var a = [1,2,3];
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3);

这个答案还是比较巧妙的,我们知道 array 也属于对象,应该和对象的规则一样。关于 array 的原型链上的 toString 方法

对于数组对象,toString 方法返回一个字符串,该字符串由数组中的每个元素的 toString() 返回值经调用 join() 方法连接(由逗号隔开)组成。

可以看到数组 toString 会调用本身的 join 方法,这里把自己的join方法该写为shift,每次返回第一个元素,而且原数组删除第一个值,正好可以使判断成立。这里 == 比较也带来的副作用

猜你喜欢

转载自blog.csdn.net/qq_39148344/article/details/88774525