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