javascript隐式类型转换详解

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呢,哈哈

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容