JavaScript

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > JS隐式类型转换

'2'>'10'==true?解析JS如何进行隐式类型转换

作者:南玖

这篇文章主要为大家介绍了'2'>'10'==true?解析JS如何进行隐式类型转换示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

'2'>'10'返回的true,可能很多人都不是很能理解吧? 在js中,当运算符在运算时,如果两边数据不统一,CPU就无法计算,这时我们编译器会自动将运算符两边的数据做一个数据类型转换,转成一样的数据类型再计算。 这种无需程序员手动转换,而由编译器自动转换的方式就称为隐式转换。

想要知道'2'>'10'为什么是true,我们得先来了解一下JavaScript的隐式类型转换规则。

隐式类型转换规则

1. == 操作符的强制类型转换规则?

2.递增递减操作符(前置与后置)、一元正负操作符

这些操作符适用于任何数据类型的值,针对不同类型的值,该操作符遵循以下规则(经过对比发现,其规则与Number()规则基本相同):

3.加法运算操作符

加号运算操作符在Javascript也用于字符串连接符,所以加号操作符的规则分两种情况:
如果两个操作值都是数值,其规则为:

如果有一个操作值为字符串,则:

4. 乘除、减号运算符、取模运算符

这些操作符针对的是运算,所以他们具有共同性:如果操作值之一不是数值,则被隐式调用Number()函数进行转换。

5.逻辑操作符(!、&&、||)

逻辑非(!)操作符首先通过Boolean()函数将它的操作值转换为布尔值,然后求反。逻辑与(&&)操作符,如果一个操作值不是布尔值时,遵循以下规则进行转换:

6.关系操作符(<, >, <=, >=)

与上述操作符一样,关系操作符的操作值也可以是任意类型的,所以使用非数值类型参与比较时也需要系统进行隐式类型转换:

7. 其他值到字符串的转换规则?

8. 其他值到数字值的转换规则?

为了将值转换为相应的基本类型值,抽象操作 ToPrimitive 会首先(通过内部操作 DefaultValue)检查该值是否有valueOf()方法。如果有并且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用 toString() 的返回值(如果存在)来进行强制类型转换。

如果 valueOf() 和 toString() 均不返回基本类型值,会产生 TypeError 错误。

9. 其他值到布尔类型的值的转换规则?

以下这些是假值: undefined、 null、 false、 +0、-0 和 NaN 、“”

假值的布尔强制类型转换结果为 false。从逻辑上说,假值列表以外的都应该是真值。

总结

NaN == NaN  //false
NaN == undefined //false
NaN == false //false
NaN == null //false
NaN==[]  //false
NaN==''  //false
NaN=={}  //false
false == false  //true
false == undefined  //false
false == null  //false
false == []  //true
false == {}  //false
false == ''  //true
undefined == undefined //true
undefined == null  //true
undefined == false //false
undefined == [] //false
undefined == {}  //false
undefined == '' //false
null == null   //true
null == NaN  //false  
null == []  //false
null == {}  //false
null == undefined  //true
0==false    //true   
0 == []  //true
0 == {}  //false
0 == null  //false
0 == undefined //false
0 == '' //true
0 == NaN //false
false == []  //true
false == {}  //false
false == null  //false
false == undefined  //false
false == ''  //true
false == NaN  //false
[]=={} //false
Boolean([])   //true
Boolean({})   //true
Boolean(null)  //false
Boolean(NaN) //false
Boolean(undefined)  //false
Boolean('')  //false
Boolean(0)  //false
Number(undefined)  //NaN
Number({})    //NaN
Number(NaN)  //NaN
Number('')  //0
Number([])    //0
Number(false)  //0
Number(null)  //0

'2'>'10'为什么是true?

上面我们列了这么多转换的规则,那么这道题我们就可以在上面这些规则中找到答案了,首先找到关系操作符,该规则中的第二点是两个操作符都是字符串的话,则比较字符串对应的字符编码值,按我们常规思维是不是会觉得他会转为数字再比较,然后2>10,返回false,然而并不是的,是不是觉得JavaScript很坑🦢。JavaScript中用charCodeAt()来获取字符编码

console.log('2'>'10') // true
//首先将操作符两边都转为字符编码再进行比较
'2'.charCodeAt() //50
'10'.charCodeAt() // 49
// 所以 '2'>'10' 会返回true

我们再来看几道有趣(很坑)的题

1.复杂数据类型转string

先调用valueOf()获取原始值,如果原始值不是string类型,则调用toString()转成string

console.log([1,2] == '1,2')  //true
[1,2].toString() // '1,2'
var a = {}
console.log(a.toString()) // "[object Object]"
console.log(a == "[object Object]") //true

解析:

先将左边数据类型转成string,然后两边都是string,再比较字符编码值

2.逻辑非隐式转换与关系运算符隐式转换

console.log([] == 0) // true
console.log(![] == 0) // true 
console.log([] == ![])  // true  是不是觉得很离谱???
console.log([] == [])  //false
console.log({} == !{}) //false
console.log({} == {})  // false

看到这些结果是不是很吃惊,是的我也觉得很吃惊,简直深坑。玩笑归玩笑,我们还是一起来看看到底是为什么吧!!

解析:

console.log([] == 0) // true
/*关系运算符(3)如果只有一个操作值是数值,则将另一个操作值转换为数值,进行数值比较
原理:
1.[].valueOf().toString() 得到字符串""
2.将""转为数字Number("") 得到数字0
所以 [] == 0 成立
*/
console.log(![] == 0) // true 
/*
原理:与上面类似,只是逻辑运算符优先级高于关系运算符,所以先执行![] 得到false
false == 0 成立
*/
console.log([] == ![])  // true  
/*
上面我们知道了 []==0 ![] == 0 
所以 [] == ![]
*/
console.log([] == [])  //false
/*
引用数据类型数据存在堆中,栈中存储的是它们的地址,两个[]地址肯定不一样,所以是false
*/
console.log({} == !{}) //false
/*
原理:
1. {}.valueOf().toString()  得到"[object,Object]"
2. !{} == false
3. Number("[object,Object]") // NaN
     Number(false) //0
4. NaN != 0
*/
console.log({} == {})  // false
/*
引用数据类型数据存在堆中,栈中存储的是它们的地址,所以肯定不一样
*/

JavaScript真值表

以上就是'2'&gt;'10'==true?解析JS如何进行隐式类型转换的详细内容,更多关于JS隐式类型转换的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文