侧边栏壁纸
博主头像
Fonda's Lab 博主等级

关山难越,谁悲失路之人?萍水相逢,尽是他乡之客。

  • 累计撰写 49 篇文章
  • 累计创建 27 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

JavaScript中的相等(隐式转换坑)

LouisFonda
2024-04-22 / 0 评论 / 0 点赞 / 18 阅读 / 0 字 / 正在检测是否收录...

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);

规则如下

  1. 当类型相同时直接比较,当类型不同时会将其转换为数值再比较 。
  2. undefined只有和null与本身才为true,其他都为false。
  3. 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);
  1. 当不同类型的值相加时,如果其中一个值是字符串,那么其他的值会被转换为字符串,如null + '1' = ' null1'
  2. 如果没有字符串,那么都会转换为数值做加法运算。
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)
```
0

评论区