javascript隐式类型转换详解
注:本文有小部分参考自你不知道的JavaScript中卷
1.==之间发生的隐式类型转换
如下面的代码在双等操作中,两边都为数字或者字符串时他们就会进行普通的值比较操作,该是啥就是啥。如果一方是数字或字符串的话则另一方就会转换成字符串或数字然后在进行值比较操作。字符串在跟数字进行比较时字符串会被转换为数字进行比较但时NaN意外是意外情况,因为NaN与任何值不相等
1==1//true
"aa"=="aa"//true
12=="12"//true
0=="+0"//true
0==[0]//true
"aaa"==["aaa"]//true
Infinity=="Infinity"//true
123=="123"//true
"+0"==0//true
"-1234567"==-1234567//true
"NaN"==NaN//false
如下面的代码如果有一方为布尔值另一方为数字的话,那么布尔值就会被转换成数字进行比较如果有一方为布尔值有一方为字符串的话,那么布尔值的一方 true转换为1,false转换为0,然后将字符串一方转换为数字然后在进行比较
0==false//true
1==true//true
123==true//false
true=="1"//true
false=="0"//true
true=="123"//false
如下面的代码在双等操作中,undefined,和null除与自身相等和互相相等以外,与其他任意值不相等
undefined==undefined//true
null==null//true
null==undefined//true
0==undefined//false
0==null//false
""==null//false
0==null//false
[]==undefined//false
undefined=={}//fasle
null==[]//false
null=={}//fasle
如下面的代码如果比较双方的值都为引用类型的话那么则比较他们的内存地址
如果一方为引用类型一方为字符串的话那么引用类型值的一方会调用toString方法然后在跟其字符串比较
如果一方为数字另一方为引用类型的值那引用类型值那一边先toString 然后在按照字符串与数字的规则进行比较
51==["51"]//true
"[object Object]"=={}//true
[1]==[1]//false
[1]==1//true
12==["12"]
2.+ - * / 操作符的隐式类型转换
在数学运算符中两边不是数字类型的值会尝试转为数字类型然后尝试进行运算如果有一方出现NaN那么运算结果就是NaN。
在+运算符中如果有一方是字符串类型的值则另一方会被转换成字符串然后进行字符串拼接操作
如果有一方为布尔值false会转为0,true会转为1
如果有一方为引用类型值 那么先调用toString方法然后再把返回的字符串在进行运算
1+undefined//NaN
1-"2"//-1
true+true+true//3
false-true//-1
"11"+11//"1111"
1-["11"]//-10
注意:在双等中会发生隐式类型转换得出一些很奇怪的运算结果,我们应该尽量避免使用双等改用三等云运算符
4.逻辑运算符 || &&
我觉得他们不应该叫逻辑运算符,应该叫“选择器运算符”或者,“操作数选择器运算符”更合适一点
别的语言会返回布尔值,而JavaScript是个奇葩,他会返回两个操作值中满足条件的那个的原值
&&的详细说法应该为 如果第一个操作值转换为布尔值为真则返回第二个操作值 如果第一个值转换为布尔值为假那么则返回第一个值如果都是真值则返回第二个值 通俗理解为&&在找假值遇到假值就返回,都是真的话那也没办法了就返回第二个了
||的详细说法为 如果第一个操作值转换为布尔值为真那么就返回第一个值,如果第一个操作值为假则返回第二个
同理:||是在找真值遇到真就返回,否则只能返回第二个了
如下面的代码
0||1 //1
0&&123//0
0||true//true
1&&false//false
5.一元运算符 + - !
这里说的+ -可不是运算的+ -而是一元运算符+ -
+"-44"//-44
-"-44"//44
+undefined//NaN
!undefined//true
-{}//NaN
-[13]//-13
!0//true
!"10"//false
!{}//fasle
![]//fasle
加减一元运算很明显会被转换成数字来进行运算,而!则会转换为布尔值而引用类型的值会先toString在乎再把字符串转换成数字进行运算而!则会转换为布尔值然后进行运算这个比较简单
6.位运算符
如还不了解位运算符,请先了解位运算符
"10"&"13"//8
[10]&[13]//8
NaN|45//45
NaN&45//0
0|{}//0
0&{}//0
Infinity|5//5
-Infinity|5//5
1024>>"1"//512
1024<<"1"//2048
位运算符也是先转换为数字然后在转换为二进制进行为运算,引用类型的值会调用toString方法得到的字符串在转换为数字然后进行位操作 NaN在位操作中会被转换为0进行位操作+Infinity和-Infinity也会被转换为0
10转换为二进制为1010,13转换为二进制为1101,两者进行与操作得到1000,1000转换为10进制为8
7.奇葩的隐式类型转换列举
[]==![]//ture
很奇怪会返回[]==![]true我们来看一下 首先![]返回fasle,[]调用toString返回空字符串,
所以就变成了""==false 空字符串会被转为数字0 fasle也会转换为数字0
Math.max()//-Infinity
Math.min()//Infinity
max和min在不加任何参数执行的情况下分别返回-Infinity和Infinity很奇怪,但是js底层就是这么写的
(![]+[]+![]).length//10
为什么会返回10呢我们来一步步看看看首先![]返回false,然后是false+[]根据[]调用toString方法返回空字符串与false拼接得到字符串false,然后进行的是'false'+false得到字符串falsefalse这个字符串的长度为10
([][[]]+[])[+!![]]+([]+{})[!+[]+!![]]//nb
为什么会返回nb呢我们来一步步看看
第一部分([ ] [[]]+[]) 整体会返回一个undefined字符串我们详细看一下
[ ] [[]]首先最里面那个方括号会调用toString返回一个空字符串这样就变成了[] [""]这样就变成了取一个空数组里面索引为""的元素所以会返回undefined然后第一部分就变成了undefined+[],最后显然得到的是undefined字符串,然后!![]返回true加上前面那个加号会吧true变成1,最后就变成了”undefined“[1]最后返回的结果显然是字符串第二部分[]+{}会返回字符串[object Object]而!+[]+!![]返回数字2最后变成"[object Object]"[2]
返回字符串b本文到这里结束了javscript的隐式类型转换是所有脚本语言里面最坑的,在实际的开发中应该禁止这样的骚操作, 看到这里是不是感觉JavaScript的隐式类型转换真的很nb呢,哈哈