摘要:雖然你可能很驚訝甚至可能懷疑是的但是這都是有語(yǔ)言自己的一個(gè)隱式類型轉(zhuǎn)換的套路?;镜碾[式類型轉(zhuǎn)換基本類型的隱式轉(zhuǎn)換這個(gè)其實(shí)我們使用的最多例如結(jié)果返回的是而不是這就是類型的隱式轉(zhuǎn)換。
基本上所有的語(yǔ)言都有 隱式類型轉(zhuǎn)換 ,但是對(duì)于 弱類型語(yǔ)言(JS) 來(lái)說(shuō) ,隱式類型轉(zhuǎn)換會(huì)比 強(qiáng)類型語(yǔ)言(Java) 帶來(lái)更大的副作用,有些行為甚至是不可思議的。雖然你可能很驚訝 ,甚至可能懷疑是 JS 的 BUG,但是這都是有 JS 語(yǔ)言自己的一個(gè)隱式類型轉(zhuǎn)換的套路。
基本的隱式類型轉(zhuǎn)換 基本類型的隱式轉(zhuǎn)換這個(gè)其實(shí)我們使用的最多,例如 "10" + 1 結(jié)果返回的是 101 而不是 11,這就是String類型的隱式轉(zhuǎn)換。
在+號(hào)的左右側(cè),只要又有一個(gè)或者兩個(gè)操作數(shù)是字符串則做拼接操作
但是其實(shí)這句話并不完全對(duì),例如[1,2] + [3,4]這種也會(huì)發(fā)生字符串拼接,至于為什么會(huì)拼接,我后面會(huì)提到,這里就先賣個(gè)關(guān)子。
還有 if、while等表達(dá)式里面會(huì)將值強(qiáng)行轉(zhuǎn)換成Boolean,-運(yùn)算符會(huì)將左右兩邊換成 Number
這些都是基本類型的隱式轉(zhuǎn)換,由于都比較熟了,加上例子太多我就不一一寫出來(lái)了
復(fù)雜類型的隱式轉(zhuǎn)化上面提到的都是基本類型和基本類型的隱式轉(zhuǎn)換,那么復(fù)雜類型是如何進(jìn)行隱式轉(zhuǎn)換的呢?
復(fù)雜類型的轉(zhuǎn)換會(huì)把自身變成基本類型,其方法就是調(diào)用 ToPrimitive,實(shí)際上就是去嘗試使用 valueOf() 和toString()獲取一個(gè)基本類型,優(yōu)先使用 valueOf 如果無(wú)法獲取到基本類型,則使用 toString。如果兩者都沒(méi)有獲取到基本類型,他會(huì)拋出一個(gè) Cannot convert object to primitive value 錯(cuò)誤.
現(xiàn)在我們看回上面提到的 [1,2] + [3,4] 實(shí)際上就是 "1,2" + "3,4" 結(jié)果自然等于 1,23,4
相等比較的隱式類型轉(zhuǎn)換在開(kāi)始講解 相等比較的隱式類型轉(zhuǎn)換 的之前,我寫幾個(gè)行代碼,大家看看下面這些代碼會(huì)打出什么類型.
false == ""; true == "why?"; false == "0"; "" == 0; [] == 0; [] == false; [] == ![]; [] == ""; [1,2,3] == "123"; [1,2,3] == "1,2,3"; let a = null,b; a == b; a == false; b == false; a == ""; b == ""; a == 0; b == 0;
大家可以執(zhí)行一下代碼,看看結(jié)果是不是與你預(yù)期的一樣。我估計(jì)能答對(duì)的人不會(huì)很多。我用一個(gè)一個(gè)案例來(lái)講明 JS的隱式類型轉(zhuǎn)換
Number 與其他類型的對(duì)比假設(shè) X 是 Number 類型,Y 是其他類型,則 X == Y 實(shí)際上是 X == Number(Y)
顯示轉(zhuǎn)化Number的時(shí)候,""和空格會(huì)被轉(zhuǎn)換為0
"" == 0 ----> Number("") == 0 ----> 0 == 0
Boolean 與其他類型的對(duì)比首先我們要明白 Boolean 中 true 和 false 的概念是什么
false 的取值范圍是 undefined、null、false、+0、-0、 NaN、""。true的取值范圍為 除了 false意外的所有 情況
然后就是在 Boolean 和其他類型相等比較 的時(shí)候,會(huì)遵循下面的一條規(guī)則
假設(shè) X 是 Boolean 類型,Y 是其他類型,則 X == Y 實(shí)際上是 Number(X) == Y
我們按著這個(gè)規(guī)則去看上面的實(shí)例
false == "" ----> 0 == ""
而剛剛我們?cè)谏厦嬲f(shuō)過(guò) 0 == "" 結(jié)果為 true
true == "why?" ----> 0 == "why?" ----> 0 == Number("why?") ----> 0 == NaN 結(jié)果為 false
至于 false == "0" 我就不解釋了,一樣的轉(zhuǎn)換邏輯
特別的 undefined 和 nullundefined 和 null 在相等的對(duì)比中是比較特別的,JS 規(guī)范中
在相等比較中 null 和 undefined 是同一個(gè)概念 也就是 null == undefined 為 true,除此之外他與任何東西都不想等
let a = null,b; a == b; //true //下面這些全部返回false a == 0; b == 0; a == ""; b == ""; a == false; b == false;關(guān)于復(fù)雜類型的相等比較
復(fù)雜類型的想等比較涉及上面講的ToPrimitive,其規(guī)則就是
假設(shè) X 是 復(fù)雜類型 類型,Y 是其他類型,則 X == Y 實(shí)際上是 ToPrimitive(X) == Y
[] == 0; // "" == 0 [] == false; // "" == false [] == ""; // "" == "" [] == ![] // [] == false [1,2,3] == "123"; // "1,2,3" == "123" [1,2,3] == "1,2,3"; // "1,2,3" == "1,2,3"一些特別的情況
NaN 與自身不想等
NaN 與自身不想等是 JS 一直以來(lái)的規(guī)范,至于有啥設(shè)計(jì)原因,我暫時(shí)不清楚,有了解的讀者可以告訴我下
本書(shū)引用了一些<<你不知道的JavaScript(2)>>的內(nèi)容,有興趣的可以買來(lái)看一下,物超所值
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107483.html
摘要:說(shuō)明在比較的時(shí)候,會(huì)進(jìn)行隱式轉(zhuǎn)換,你如果對(duì)隱式轉(zhuǎn)換不是特別熟悉,結(jié)果往往出乎你的意料。解釋相信我,這行代碼是簡(jiǎn)單的,它并不復(fù)雜,我們先來(lái)分解一下這行代碼我們把這一行,分解成了行了。簡(jiǎn)單說(shuō)中的與方法簡(jiǎn)單說(shuō)與引發(fā)的思考 說(shuō)明 JavaScript在比較的時(shí)候,會(huì)進(jìn)行隱式轉(zhuǎn)換,你如果對(duì)隱式轉(zhuǎn)換不是特別熟悉,結(jié)果往往出乎你的意料。 我們來(lái)看看這行代碼 (![]+[])[+!![]- -+!!...
摘要:說(shuō)明在比較的時(shí)候,會(huì)進(jìn)行隱式轉(zhuǎn)換,你如果對(duì)隱式轉(zhuǎn)換不是特別熟悉,結(jié)果往往出乎你的意料。解釋相信我,這行代碼是簡(jiǎn)單的,它并不復(fù)雜,我們先來(lái)分解一下這行代碼我們把這一行,分解成了行了。簡(jiǎn)單說(shuō)中的與方法簡(jiǎn)單說(shuō)與引發(fā)的思考 說(shuō)明 JavaScript在比較的時(shí)候,會(huì)進(jìn)行隱式轉(zhuǎn)換,你如果對(duì)隱式轉(zhuǎn)換不是特別熟悉,結(jié)果往往出乎你的意料。 我們來(lái)看看這行代碼 (![]+[])[+!![]- -+!!...
摘要:說(shuō)明在比較的時(shí)候,會(huì)進(jìn)行隱式轉(zhuǎn)換,你如果對(duì)隱式轉(zhuǎn)換不是特別熟悉,結(jié)果往往出乎你的意料。解釋相信我,這行代碼是簡(jiǎn)單的,它并不復(fù)雜,我們先來(lái)分解一下這行代碼我們把這一行,分解成了行了。簡(jiǎn)單說(shuō)中的與方法簡(jiǎn)單說(shuō)與引發(fā)的思考 說(shuō)明 JavaScript在比較的時(shí)候,會(huì)進(jìn)行隱式轉(zhuǎn)換,你如果對(duì)隱式轉(zhuǎn)換不是特別熟悉,結(jié)果往往出乎你的意料。 我們來(lái)看看這行代碼 (![]+[])[+!![]- -+!!...
摘要:看下面的代碼和會(huì)對(duì)操作數(shù)執(zhí)行條件判斷,如果操作數(shù)不是布爾值,會(huì)先執(zhí)行類型轉(zhuǎn)換后再執(zhí)行條件判斷。大家記住這個(gè)規(guī)則布爾值如果與其他類型進(jìn)行抽象比較,會(huì)先用將布爾值轉(zhuǎn)換為數(shù)字再比較。 在上一篇中我們聊過(guò)了 JS 類型轉(zhuǎn)換的規(guī)則和我發(fā)現(xiàn)的一些常見(jiàn)書(shū)籍中關(guān)于類型轉(zhuǎn)換的一些小錯(cuò)誤,當(dāng)碰到顯示類型轉(zhuǎn)換的時(shí)候大家可以按照這些規(guī)則去拆解出答案。但 JS 中存在一些很隱晦的隱式類型轉(zhuǎn)換,這一篇就來(lái)談下我對(duì)...
閱讀 1686·2019-08-30 15:55
閱讀 997·2019-08-30 15:44
閱讀 892·2019-08-30 10:48
閱讀 2064·2019-08-29 13:42
閱讀 3205·2019-08-29 11:16
閱讀 1336·2019-08-29 11:09
閱讀 2079·2019-08-26 11:46
閱讀 636·2019-08-26 11:44