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