js中隐式类型转换的规则

虽然开发中基本都是用的===全等,==很少用,基本不用,但奈何有些面试题考的很刁钻,我就来做个小总结把

大多数隐式转换的规则:

先说结论:大多数情况下,隐式转换都遵循这个规则,当然有特殊情况,特殊情况特殊对待就行了,当使用==判等时,会转成同类型再比较
在这里插入图片描述
1. 对象和布尔值比较

对象和布尔值进行比较时,对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字

[] == true; //false []转换为字符串'',然后转换为数字0,true转换为数字1,所以为false

   
   
  • 1

2. 对象和字符串比较

对象和字符串进行比较时,对象转换为字符串,然后两者进行比较。

[1,2,3] == '1,2,3' // true [1,2,3]转化为'1,2,3',然后和'1,2,3', so结果为true;

   
   
  • 1

3. 对象和数字比较

对象和数字进行比较时,对象先转换为字符串,然后转换为数字,再和数字进行比较。

[1] == 1; // true `对象先转换为字符串再转换为数字,二者再比较 [1] => '1' => 1 所以结果为true

   
   
  • 1

4. 字符串和数字比较

字符串和数字进行比较时,字符串转换成数字,二者再比较。

'1' == 1 // true

   
   
  • 1

5. 字符串和布尔值比较

字符串和布尔值进行比较时,二者全部转换成数值再比较。

'1' == true; // true

   
   
  • 1

6. 布尔值和数字比较

布尔值和数字进行比较时,布尔转换为数字,二者比较。

true == 1 // true

   
   
  • 1

以上把四种类型两两不同的比较了一遍,都印证了我一开始说的隐式转换规则,没毛病



转boolean值为false的情况:

下面6种值转化为布尔值时为false,其他转化都为true

1、undefined(未定义,找不到值时出现)

2、null(代表空值)

3、false(布尔值的false,字符串"false"布尔值为true)

4、0(数字0,字符串"0"布尔值为true)

5、NaN(无法计算结果时出现,表示"非数值";但是typeof NaN===“number”)

6、""(双引号)或’’(单引号) (空字符串,中间有空格时也是true)

console.log(!!undefined)    //false
console.log(!!null)        //false
console.log(!!"")  		 //false
console.log(!!false)    //false
console.log(!!NaN)    //false
console.log(!!0)     //false

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这样就好理解以下情况了:

console.log(![])   //true
console.log(!{})   //true

   
   
  • 1
  • 2



复杂数据类型的转换规则:

1.先使用valueOf()方法获取原始值
2.再使用toString()转成字符串
3.在使用number把字符串转成数字

console.log([1,2].valueOf())    //[1,2]
console.log([1,2].valueOf().toString())   //1,2

console.log({name:“test”}.valueOf()) //{name:”test“}
console.log({name:“test”}.valueOf().toString()) //[object Object]

console.log([].valueOf())    //[]
console.log([].valueOf().toString())   //""

console.log({}.valueOf()) //{}
console.log({}.valueOf().toString()) //[object Object]

这样就解释如下这种奇怪的现象了

[] == false  //true
{} == false  //false  



特殊情况:

当然上述也说了大多数情况下遵循的规则而已,也有很多特殊情况,我们来特殊区别一下:

![] == false   //true   多了一个!,此时[ ]会优先转成boolean值,
所以为true,取反就是false了,结果为true

 
 
[]==![] //true   因为有!,优先级最高,![]结果为false,最终转换成 [] == false 的比较,
按照开篇多数情况下的规则图转换,结果为true

 
 
[]==[]   //false   比较的是地址
{}=={}   //false  比较的是地址

 
 



到目前为止,以下的特殊情况,你应该都能判断出来了:

///太坑
console.log([]==0)   //true
console.log(![]==0)  //true
//神坑
console.log([]==![])   //true
console.log([]==[])   //false
//史诗级坑
console.log({}=={})    //false
console.log({}==!{})    //false
//相当于
console.log({}==false)   //false
//相当于
console.log({}==0)    //false
//相当于 
console.log("[object Oject]"==0)    //false

 
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值