日常开发,在写业务逻辑时肯定会用到if语句,或者三元,来进行下一步的业务操作或是赋值给某个变量?但是变量之间的判断比较,你真的有彻底搞明白吗?
if (a == 1 && a == 2 && a==3 ) {
// doing something
console.log('finished')
}
这个if判断能走通吗?答案是可以的。那a到底或是一个什么类型的变量呢?数字?字符串?还是数组或者是对象呢?
在这呢,先不说a到底是什么类型的变量,我们先来了解下 == 比较的特性和藏在他身上的秘密。
== 比较
- 先比较变量类型。如果类型一致的话,则进行第二点的比较,如果类型不一致,则将变量转换为基本类型,然后进行比较。至于7与’7’之间的比较,到底是都转换成了Number类型?还是String类型呢?根据规范的话,应该是都被转换成了Number类型进行的比较。
- 两边变量的类型一致时,进行值的比较。基本类型与基本类型比较,引用类型与引用类型比较(这个比较的意义不大)。
- 这一点作为补充点,也是非常重要的一点。第一点中有说道类型转换,而变量本身的类型转换则是调用自身的两个方法,先是valueOf,如果还不是基本类型,则继续调用toString。
看完以上三点,各位想到如何让 if(a == 1 && a == 2 && a == 3)走通了吗?要不思考🤔两分钟,自己试着写一写?
答案
{
let a = {
a: 1,
tip: '觉得有用就分享吧,哈哈',
valueOf: function(){
return this.a++
}
}
if (a==1 && a==2 && a==3) { // ok
// doing something
console.log('finished')
}
}
{
let a = ['给我点个赞吧,哈哈'];
Array.prototype.valueOf = function(){
if (this.length === 1) {
this.length = 2;
return 1
}
if (this.length === 2) {
this.length = 3;
return 2
}
if (this.length === 3) {
this.length = 4;
return 3
}
}
if (a==1 && a==2 && a==3) { // ok
// doing something
console.log('finished')
}
}
{
let a = new String('你们肯定可以写出无数个');
let abc = 1;
String.prototype.valueOf = function(){
return abc++
}
if (a==1 && a==2 && a==3) { // ok
// doing something
console.log('finished')
}
}
// ......
让if (a == 1 && a == 2 && a == 3) 走的通的答案可以有无数个,所以这并不是什么不可能的事情,我在这里只用到了valueOf这一个方法,有兴趣的朋友可以再试一试toString这个方法,还有valueOf的优先级是不是高于toString呢。
这种判断场景可能在实际开发中很少用的到,或许你敲了一辈子代码,也不会遇到,但是这个问题可以帮你更好理解 == 比较时做了哪些动作。还有实际开发中到底应该是用 == 还是应该用 === 呢。相信有很多朋友有遇到过用 == 判断时出现的问题,在这里,附上一份常见的变量之间相互判断比较结果的图片。
前端小菜鸟,哪里写的不对,还请各位大佬快快指出,非常感谢。
转载请注明出处,写了一个多小时呢,谢谢。