JS隱式數(shù)據(jù)類型轉(zhuǎn)換

隱式數(shù)據(jù)類型轉(zhuǎn)換介紹

前面有總結(jié)過 JS數(shù)據(jù)類型轉(zhuǎn)換 Number(), toString(), parseInt()等都是屬于強(qiáng)制轉(zhuǎn)換葛假。有時(shí)我們遇到當(dāng)運(yùn)算符在運(yùn)算時(shí),如果兩邊數(shù)據(jù)類型不統(tǒng)一狂塘,CPU無法計(jì)算,這是編譯器會(huì)自動(dòng)將運(yùn)算符兩邊的數(shù)據(jù)做一個(gè)數(shù)據(jù)類型轉(zhuǎn)換,轉(zhuǎn)換成一樣的數(shù)據(jù)類型在進(jìn)行運(yùn)算谷朝,這種無需程序員手動(dòng)轉(zhuǎn)換斜姥,而由編譯器自動(dòng)轉(zhuǎn)換的方式就稱為隱式轉(zhuǎn)換鸿竖。

隱式轉(zhuǎn)換規(guī)則

1.轉(zhuǎn)為number類型:+ - * / ++ --(算數(shù)運(yùn)算符) > < >= <= == != === !==(比較運(yùn)算符)沧竟;
2.轉(zhuǎn)為string類型:+ 不僅是算術(shù)運(yùn)算符,還可以做為字符串連接符把數(shù)據(jù)轉(zhuǎn)換成string類型缚忧;
3.轉(zhuǎn)為boolean類型: !(邏輯非運(yùn)算符)
另外需要補(bǔ)充的一點(diǎn)常用的幾種運(yùn)算符各運(yùn)算符優(yōu)先級(jí):
算術(shù)運(yùn)算符:+ - * / ++ --
比較運(yùn)算符: > < >= <= == != === !==
邏輯運(yùn)算符:&& || !
賦值運(yùn)算符:= += -= *= /=
算術(shù)運(yùn)算符 > 比較運(yùn)算符 > 邏輯運(yùn)算符 > 賦值運(yùn)算符

字符串連接符與算術(shù)隱式轉(zhuǎn)換規(guī)則混淆
    console.log(1 + true);      //2
    console.log(1 + "true");        //"1true"
    console.log(1 + undefined);     //NaN
    console.log(1 + null);      //1

+兩邊有一邊是字符串悟泵,那這個(gè)+就是字符串連接符,它會(huì)把其他數(shù)據(jù)類型調(diào)用String()方法轉(zhuǎn)成字符串然后拼接闪水;
+做為算術(shù)運(yùn)算符會(huì)把其他數(shù)據(jù)類型調(diào)用Number()轉(zhuǎn)成數(shù)字然后做加法運(yùn)算;
布爾值true會(huì)被轉(zhuǎn)換數(shù)字 1糕非,
undefined會(huì)被轉(zhuǎn)換為 NaN
null會(huì)轉(zhuǎn)換為數(shù)字 0

比較運(yùn)算符會(huì)把其他數(shù)據(jù)類型轉(zhuǎn)換number數(shù)據(jù)類型后再比較
    console.log("2" > 10);      //false
    console.log("a" > 10);      //false
    console.log(10 > "a");      //false
    console.log(Number("a"));      //NaN
    console.log("2" > "10");        //true    '2'.charCodeAt() > '10'.charCodeAt() = 50 > 49 = true
    console.log(false == 0);        //true
    console.log(false == "");       //true
    console.log(Number(false));       //0
    console.log(NaN == NaN);        //false
    console.log(undefined == null);     //true
    console.log(Number(NaN));       //NaN
    console.log(Number(undefined));     //NaN
    console.log(Number(null))       //0

比較運(yùn)算符的一邊是字符串的時(shí)候球榆,會(huì)調(diào)用 Number() 方法把字符串轉(zhuǎn)換成數(shù)字在進(jìn)行比較朽肥;
當(dāng)關(guān)系運(yùn)算符兩邊都是字符串的時(shí)候,此時(shí)同時(shí)轉(zhuǎn)成number然后比較關(guān)系持钉。重點(diǎn):此時(shí)并不是按照Number()的形式轉(zhuǎn)成數(shù)字衡招,而是按照字符串對(duì)應(yīng)的unicode編碼來轉(zhuǎn)成數(shù)字,使用 字符串.charCodeAt(字符下標(biāo)每强,默認(rèn)為0) 方法可以查看字符的unicode編碼始腾。
布爾值和數(shù)字比較時(shí),會(huì)把布爾值通過 Number() 轉(zhuǎn)成數(shù)字再進(jìn)行比較空执,true轉(zhuǎn)成 1浪箭,false 轉(zhuǎn)成 0
字符串和布爾值比較時(shí)辨绊,會(huì)把字符串和布爾值都通過 Number() 轉(zhuǎn)成數(shù)字再進(jìn)行比較
在javascript中有兩種特殊情況無視規(guī)則:1. null == undefined山林; 2. NaN和誰都不相等,包括他自己

復(fù)雜數(shù)據(jù)類型的隱式轉(zhuǎn)換

復(fù)雜數(shù)據(jù)類型轉(zhuǎn)成number數(shù)據(jù)類型:
1.先使用 valueOf() 方法獲取原始值邢羔,如果原始值不是number數(shù)據(jù)類型驼抹,則使用 toString() 方法轉(zhuǎn)成string;
2.再通過 Number() 方法裝成number數(shù)據(jù)類型
需要注意的:空數(shù)組的toString()方法會(huì)得到空字符串拜鹤,而空對(duì)象的toString()方法會(huì)得到字符串[object Object]

    console.log([1,2] == '1,2');        //true  先將左邊數(shù)組轉(zhuǎn)成string框冀,然后右邊也是string則轉(zhuǎn)成unicode編碼運(yùn)算
    console.log([] == 0);       //true  默認(rèn)通過同String()轉(zhuǎn)成空字符串,再通過Number("")轉(zhuǎn)成0
    var a = {};
    console.log(a == 0);        //false
    console.log(a.valueOf().toString());        //"[object Object]"
邏輯非隱式轉(zhuǎn)換和比較運(yùn)算符隱式轉(zhuǎn)換搞混淆

0敏簿、-0明也、NaNundefined惯裕、null温数、""(空字符串)這幾種情況轉(zhuǎn)換布爾類型會(huì)得到 false,除了這幾種情況外所有數(shù)據(jù)類型都會(huì)得到 true

    //大坑
    console.log ( [] == 0 );        //true
    console.log ( ! [] == 0 );      //true
    //神坑
    console.log ( [] == ! [] );     //true
    console.log ( [] == [] );       //false
    //史詩(shī)級(jí)坑
    console.log({} == !{});     //false
    console.log({} == {});      //false

[]0比較:
(1)[].valueOf().toString() 得到空字符串
(2)Number("") == 0 成立
![]0比較:
(1)邏輯非優(yōu)先級(jí)高于關(guān)系運(yùn)算符 ![] = false (空數(shù)組轉(zhuǎn)布爾得到true蜻势,然后取反得到false)
(2)false == 0 成立
[]![]比較:
(1) [].valueOf().toString() 得到空字符串 ""
(2) ![] = false
(3) Number("") == Number(false) 成立 都是0
[][]比較:
引用類型數(shù)據(jù)存在堆內(nèi)存中撑刺,棧內(nèi)存中存儲(chǔ)的是地址,所以他們的結(jié)果是false
{}!{}比較:
(1) {}.valueOf().toString() 得到字符串'[object Object]'
(2) !{} = false
(3) Number('[object Object]') == Number(false) 不成立握玛,因?yàn)檗D(zhuǎn)換到最后 是NaN0比較够傍,所以結(jié)果為 false
{}{}比較:
引用類型數(shù)據(jù)存在堆內(nèi)存中甫菠,棧內(nèi)存中存儲(chǔ)的是地址,所以他們的結(jié)果是false

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冕屯,一起剝皮案震驚了整個(gè)濱河市寂诱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌安聘,老刑警劉巖痰洒,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異浴韭,居然都是意外死亡丘喻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門囱桨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仓犬,“玉大人,你說我怎么就攤上這事舍肠〔蠹蹋” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵翠语,是天一觀的道長(zhǎng)叽躯。 經(jīng)常有香客問我,道長(zhǎng)肌括,這世上最難降的妖魔是什么点骑? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮谍夭,結(jié)果婚禮上黑滴,老公的妹妹穿的比我還像新娘。我一直安慰自己紧索,他們只是感情好袁辈,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著珠漂,像睡著了一般晚缩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上媳危,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天荞彼,我揣著相機(jī)與錄音,去河邊找鬼待笑。 笑死鸣皂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播签夭,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼齐邦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼椎侠!你這毒婦竟也來了第租?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤我纪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瀑罗,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冗酿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了术健。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汹碱。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖荞估,靈堂內(nèi)的尸體忽然破棺而出咳促,到底是詐尸還是另有隱情,我是刑警寧澤勘伺,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布跪腹,位于F島的核電站,受9級(jí)特大地震影響飞醉,放射性物質(zhì)發(fā)生泄漏冲茸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一缅帘、第九天 我趴在偏房一處隱蔽的房頂上張望轴术。 院中可真熱鬧,春花似錦钦无、人聲如沸逗栽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)祭陷。三九已至,卻和暖如春趣席,著一層夾襖步出監(jiān)牢的瞬間兵志,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工宣肚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留想罕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像按价,于是被迫代替她去往敵國(guó)和親惭适。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 隱式轉(zhuǎn)換介紹 在js中楼镐,當(dāng)運(yùn)算符在運(yùn)算時(shí)癞志,如果兩邊數(shù)據(jù)不統(tǒng)一,CPU就無法計(jì)算框产,這時(shí)我們編譯器會(huì)自動(dòng)將運(yùn)算符兩邊的...
    遼A丶孫悟空閱讀 1,409評(píng)論 0 23
  • 強(qiáng)制轉(zhuǎn)換 強(qiáng)制轉(zhuǎn)換主要指使用Number凄杯、String和Boolean三個(gè)構(gòu)造函數(shù),手動(dòng)將各種類型的值秉宿,轉(zhuǎn)換成數(shù)字...
    燈火闌珊Zone閱讀 390評(píng)論 0 3
  • 使用Number函數(shù)戒突,可以將任意類型的值轉(zhuǎn)化成數(shù)值。 下面分成兩種情況討論描睦,一種是參數(shù)是原始類型的值膊存,另一種是參數(shù)...
    青春前行閱讀 489評(píng)論 0 0
  • 1、js數(shù)據(jù)類型 js中有7種數(shù)據(jù)類型忱叭,可以分為兩類:原始類型隔崎、對(duì)象類型: 基礎(chǔ)類型(原始值): Undefine...
    好奇男孩閱讀 9,792評(píng)論 1 16
  • 前言:之前的博客你真的了解JS的數(shù)據(jù)類型?介紹了JS中的各種數(shù)據(jù)類型窑多,那么可不可以把其他的數(shù)據(jù)類型轉(zhuǎn)換成特定的一種...
    饑人谷_羅超閱讀 252評(píng)論 0 2