强制类型转换之(==)

本文深入探讨了JavaScript中隐式类型转换的机制,包括不同数据类型间的转换规则,以及在比较运算符作用下如何进行类型转换。通过具体实例,解析了隐式转换的阶段性过程,帮助读者理解复杂的隐式转换现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可能大家平时大多使用(===),尽量避免了(==),但是在进行(>)和(<)的时候也会发生(==)同样的隐式转换,所以这个知识点是必须掌握的。

左值(x)右值(y)隐式处理
NumberStringToNumber(y)
StringNumberToNumber(x)
BooleanothersToNumber(x)
othersBooleanToNumber(y)
Object!ObjectToprimitive(x)
!ObjectObjectToprimitive(y)

注意:此处的others表示其它基础类型

Toprimitive(Object)

​ 先返回valueOf()的值,若返回的不是基础类型的值,

​ 则返回toString()的值,若返回的不是基础类型的值,

​ 则抛出异常。

比较特殊的知识点

null和undefined单独出现与其他值进行比较不进行转换。

isNaN(Number(undefined))  //true
Number(null)===0  //true
Number("[空值或空值的组合]")===0  //true
复制代码
什么是空值?
  1. null
  2. (啥都没有)
  3. (Space空格)
  4. (空格的转义)
  5. (Tab缩进)
  6. \r
  7. \n
  8. \f
  9. \t
  10. 可能还有,我只知道这么多了

掌握以上知识点其实已经完全掌握在”==“的状况下的隐式转换了。

下面让我们来分析一下如何判断隐式转换

​ 首先,要纠正一下思维,(==)指可以进行强制类型转换的等于比较,隐式转换只是在双方属于不同类型的时候才会触发,遇到相同类型会直接比较。并且隐式转换具有阶段性,一会我们马上就会遇到。

​ 下面开始分析,看一下下面的例子

[] == 0; //true
复制代码

​ 看这个例子,它符合左值为”Object“,右值为”Number“的情况,所以进行Toprimitive([]),变为

"" == 0;
复制代码

​ 此时我们把这个结果叫做隐式转换的第一阶段结果,因为(==)两边的类型还是不相同,所以要再次进行隐式转换,现在它符合左值为“String”,右值为“Number的情况”,所以进行ToNumber(“”),根据上面所说的特殊知识点,变为

0 == 0;  //true
复制代码

​ 此时为第二阶段的结果,类型相同,进行比较。

​ 下面你可以试着自己分析一下下面的例子

[null] == 0;  //true
复制代码

​ 不要着急,让我们再来一个例子

[] == [null];  //false
复制代码

​ 啊???怎么回事,结果跟我们想像的好像不一样?既然([]==0)和([null]==0),难道根据这两个结果不应该是推导出([]==[null])嘛?原因在于你没有遵守我们分析的隐式转换原则,只有不同类型才会进行隐式转换,但是现在我们比较的两个值是相同的类型!

以上内容同样适用于(<)和(>)

​ 但是要注意(<=)和(>=),他在引擎中会被处理成不大于和不小于,如:

a<=b    --->    !(a>b)
复制代码

​ 为什么要说这点?试着输出下面的例子你就明白了

var a= {b:1};
var b= {b:2};

console.log(a>b);  //false
console.log(a==b);  //false
console.log(a>=b);  //true
复制代码

转载于:https://juejin.im/post/5bf4dfe2518825490e0f799c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值