JavaScript中相等(==)
相等
在js中比较两个值是否相等使用"=="来比较,比如判断a变量是否等于b变量
if(a==b) {
console.log("这两个变量是相等的")
}
上面的例子大家都知道,但是js的==有时候的表现会很匪夷所思,因为它会进行隐式转换。
隐式转换
看看下面这个例子,看你能不能写对
console.log(0 == '');
console.log(0 == '0');
console.log(2 == true);
console.log(2 == false);
console.log('false' == false);
console.log(0 == false);
console.log(false == undefined);
console.log(false == null);
console.log(null == undefined);
规则如下
- 当类型相同时直接比较,当类型不同时会将其转换为数值再比较 。
- undefined只有和null与本身才为true,其他都为false。
- Nan与任何值比较都为false,包括自身。
console.log(0 == ''); // 类型不同, ''转换为0,true `
console.log(0 == '0'); // '0'转换为 0,true
console.log(2 == true); // true转换为1,false
console.log(2 == false); // false 转换为0, false
console.log('false' == false);// Nan不等于0, false
console.log(0 == false); // false转换为0, true
console.log(false == undefined); // 第2条规则,false
console.log(false == null); // false
console.log(null == undefined); // true
带算数运算的比较
看一看自己能不能做对
console.log(null + '1' == null + 1);
console.log(null + 1 == 1);
console.log(null == 0);
console.log(null == undefined);
console.log(null + 1 == undefined + 1);
console.log(null + null == undefined + undefined);
- 当不同类型的值相加时,如果其中一个值是字符串,那么其他的值会被转换为字符串,如null + '1' = ' null1'
- 如果没有字符串,那么都会转换为数值做加法运算。
console.log(null + '1' == null + 1); // 有字符串则做拼接 'null1' == 1, false
console.log(null + 1 == 1); // null只与undefined和自身相等,true
console.log(null == 0); // 0==0,true
console.log(null == undefined); // true
console.log(null + 1 == undefined + 1); // 1 == Nan false
console.log(null + null == undefined + undefined); // 0 == Nan false
⚠️注意
当与引用做比较时,会将引用类型转换为原始值,再比较,js会调用对象的valueOf对象获取原始值,如果没有则通过toString()获取,如[1,2,3,4,5] == '1,2,3,4,5',看下面这个题
var obj1 = {
a: 1,
b: 2,
valueOf: function(){
return this.a + this.b
},
toString: function(){
return 1
}
}
var obj2 = {
toString: function () {
return 0
}
}
console.log(obj1 + !!obj2); // 结果为4
// obj1会调用valueOf获取原始值,获得的结果为3,!!会将一个"真值"(truthy)转换为true,会将一个"假值"(falsy)转换为false
// 对象为truthy所以转换为true,3 + true = 3 +1 = 4
truthy(真值)
if (true)
if ({})
if ([])
if (42)
if ("0")
if ("false")
if (new Date())
if (-42)
if (12n)
if (3.14)
if (-3.14)
if (Infinity)
if (-Infinity)
falsy(假值)
0, -0 , '', false, null, undefined, Nan, 0n(bigint的0)
```
评论区