几天上班看到一个题目就是
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 方法
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
,每次返回第一个元素,而且原数组删除第一个值,正好可以使判断成立。这里 == 比较也带来的副作用