JavaScript关于==隐式转换的判断

一.以下数据类型转布尔值,以下均返回true:

1. 非空字符串

2. 非零数值

3. 数组

4. 对象

5. 函数

二.判断方法:

1. 前提条件:

1) 相等操作符,不同数据类型会根据一定规则转换为同一数据类型再比较

注意: (这里指的数据类型也可能需要转换,总之最后比较时一定是同一数据类型)进行比较

2. 数组与数组比较,比较的是其引用:

a数组==b数组,不管左边和右边的数组是否完全一样,都是false

所以[同理[] == []是false, {} == {}是false

3. 不同类型比较,遇数值则转数值,布尔值自身转数值

1) a为非数字变量:

a==布尔值 =>先将右边的布尔值转化为数字, true是1,false是0;左边a需要转换为数字进行比较; 布尔值==a同理

2) a为非数字变量:

a==数字=>将左边a转化为原始值再转化为数字比较; 数字==a同理

总结:

数组、对象和函数在与其他基本数据类型进行比较时都会先转换为字符串,然后再转换为相应的数据类型

4.非空非零引用型,转为布尔均为真

注意: [], {}转化为布尔值也是true

5. null、undefined和NaN

这三个是个特例,他们比较特殊:

1) null==undefined为true;

2) null和undefined不会进行数据转换;

3) NaN不与任何值相等,甚至包括它自己!

三.实例及分析:

1. []==![]的比较结果是什么?(答案:true)

解析过程:

1) 将右侧[]转换为布尔值后再取反,[]转换布尔值是true,![]相当于true取反为false

2) 根据二判断方法第3条:“比较前需要布尔值转数值”规则,右边的false转换为数字0

3) 根据“比较前数组遇数值先转字符串后转数值”规则,相当于左边[]先使用toString()转换为字符串'',''再转换为数字就是0, 和右边的0比较自然相等

2. [] == []的比较结果是什么?(答案是false)

解析过程: 

根据二判断方法第2条:"数组与数组比较,比较的是其引用", 如果属于不同的引用, 结果是false

注意: 不管==左右两边是什么类型的数组进行比较, 引用若不同, 答案都是false

3. 练习题:

let val = [] == ![]

console.log(val) // true

console.log([+val, [] + 1] == [1, 1] + []) // true

console.log([+val, [] + 1] == [1, '1']) // false

解析过程:

/**

* 1. 先看右边, ![]转换为布尔值false

* 2. 一边是布尔值的时候,一边就要转换为数字=>左边[]转换为0

* 3. 右边 =>false转换为数字=>也就是0

* 4. 左边0 == 右边0, 自然结果是true

*/

let val = [] == ![]

console.log(val) // true

/**

* 1. 从上面可知val是true, true遇上+号隐式转换为数字是1

* 2. []+1 => ''+1 => 字符串'1'

* 3. 所以左边是[1, '1']

* 4. 右边: [1,1]+[] => [1,1]+'' =>相当于使用了arr.toString()[效果相当于arr.join(',')] => 得到字符串'1,1'

* 5. 左边也使用使用arr.join(',') => 得到字符串'1,1'

* 6. 左边'1,1' == 右边'1,1', 结果为true

*/

console.log([+val, [] + 1] == [1, 1] + []) // true

// 根据二判断方法第2条:"数组与数组比较,比较的是其引用", 答案都是false

console.log([+val, [] + 1] == [1, '1']) // false

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值