摘要:所謂裝箱轉(zhuǎn)換,正是把基本類型轉(zhuǎn)換為對應(yīng)的對象,他是類型轉(zhuǎn)換中一種相當(dāng)重要的種類。拆箱轉(zhuǎn)換在標(biāo)準(zhǔn)中,規(guī)定了函數(shù),它是對象類型到基本類型的轉(zhuǎn)換即,拆箱轉(zhuǎn)換。拆箱轉(zhuǎn)換會嘗試調(diào)用和來獲得拆箱后的基本類型。
JavaScript隱式類型轉(zhuǎn)換 基本數(shù)據(jù)類型
ECMAScript 一共定義了七種 build-in types,其中六種為 Primitive Value,Null, Undefined,String, Number, Boolean, Symbol。而最后一種 Object build-in type 與通常意義上的 JavaScript 中 Object 并不一樣,總的來說,只要不屬于 Primitive Value 的值,就屬于 Object 類型,比如數(shù)組、對象、日期、正則、函數(shù)。
裝箱轉(zhuǎn)換每一種基本類型 number, string, boolean, symbol 在 Object(build-in type) 中都有對應(yīng)的類。所謂裝箱轉(zhuǎn)換,正是把基本類型轉(zhuǎn)換為對應(yīng)的對象,他是類型轉(zhuǎn)換中一種相當(dāng)重要的種類。
JavaScript 語言設(shè)計上試圖模糊對象和基本類型之間的關(guān)系,比如,我們可以直接在基本類型上使用對象的方法:
console.log("abc".charAt()); // a
甚至我們在原型上添加方法,都可以應(yīng)用于基本類型。
實際上是 . 運(yùn)算符提供了裝箱操作,它會根據(jù)基礎(chǔ)類型構(gòu)造一個臨時對象,使得我們能在基礎(chǔ)類型上調(diào)用對應(yīng)對象的方法。
拆箱轉(zhuǎn)換在 JavaScript 標(biāo)準(zhǔn)中,規(guī)定了 ToPrimitive 函數(shù),它是對象類型到基本類型的轉(zhuǎn)換(即,拆箱轉(zhuǎn)換)。
對象到 String 和 Number 的轉(zhuǎn)換都遵循“先拆箱再轉(zhuǎn)換”的規(guī)則。通過拆箱轉(zhuǎn)換,把對象變成基本類型,再從基本類型轉(zhuǎn)換為對應(yīng)的 String 或者 Number。
拆箱轉(zhuǎn)換會嘗試調(diào)用 valueOf 和 toString 來獲得拆箱后的基本類型。如果 valueOf 和 toString 都不存在,或者沒有返回基本類型,則會產(chǎn)生類型錯誤 TypeError。
ToPrimitiveToPrimitive 用于將 Object 轉(zhuǎn)為 Primitive Value
對于我們平常遇到的 Object,其處理邏輯是:
調(diào)用 Object.valueOf,如果結(jié)果是 Primitive Value,則返回;
調(diào)用 Object.toString,如果結(jié)果是 Primitive Value,則返回;
都不是,返回 TypeError
普通對象和數(shù)組的這兩個方法返回的結(jié)果如下:
var a = [12] var b = {a: 123} // [12] a.valueOf() // "12" a.toString() // {a: 123} b.valueOf() // "[object Object]" b.toString()
如上,兩者的 valueOf 返回的都不是 Primitive Value (返回了自身,還是 Object 類型)。那么,根據(jù)規(guī)范,兩者調(diào)用 ToPrimitive 返回的將是一個 字符串。
顯示類型轉(zhuǎn)換 ToBoolean這個方法用于將不是 Boolean 類型的值轉(zhuǎn)換為 Boolean 類型。
Undefined 返回 false
Null 返回 false
所有 Object 類型都會被轉(zhuǎn)換為 true;
Number 類型中,0,NaN 會被轉(zhuǎn)換為 false,其它都為 true
只有空字符串為 false,其它都為 true
ToNumber其它類型轉(zhuǎn)換為 Number 類型。
Undefined 返回 NaN
Null 返回 0
Boolean 類型,true 為 1; false 為 0
String 類型,如果滿足數(shù)字語義則轉(zhuǎn)為數(shù)字,否則轉(zhuǎn)換為 NaN
Object 類型,先轉(zhuǎn)換為 Primitive Value 再遞歸調(diào)用自身 ToNumber 來轉(zhuǎn)換。
// "56" ==> 56 Number([56]) // ",56" ==> NaN Number([,56]) // "55,56" ==> NaN Number([55, 56])ToString
Number 返回 對應(yīng)數(shù)值字符串
Boolean 返回字符串 “true” 或者 “false”
Undefined 返回 “undefined”
Null 返回 “null”
隱式類型轉(zhuǎn)換了解了上面的知識,可以開始進(jìn)入我們的正題了,在 JavaScript 中可以觸發(fā)隱式類型轉(zhuǎn)換的操作有:
四則運(yùn)算: +, -, *, /
比較運(yùn)算符: ==, <, >, >=, <=
判斷語句: if, while
Native調(diào)用: console, alet 輸入時會自動轉(zhuǎn)換成 String 類型
邏輯非 !,將直接調(diào)用 ToBoolean 方法,然后取反返回。
比較運(yùn)算符 非嚴(yán)格比較(==)如果 Type 相同,等價于 A === B
特別的, undefined == null
String == Number,則把 String 轉(zhuǎn)換成 Number
有 Boolean 值的,將 Boolean 轉(zhuǎn)換成 Number
Object String/Number/Symbol,將 Object 轉(zhuǎn)換成 Primitive Value
否則,返回 false
// "12" ==> 12; // 返回 true 12 == "12" // 轉(zhuǎn) boolean: [] == 0 // 轉(zhuǎn) object: "" == 0 // 轉(zhuǎn) string: 0 == 0 // 返回 true [] == false // 轉(zhuǎn) object: "45" == 45 // 轉(zhuǎn) string: 45 == 45 // 返回 true [45] == 45 // 單目: {} == false // 轉(zhuǎn) boolean: {} == 0 // 轉(zhuǎn) object: "[object Object]" == 0 // 轉(zhuǎn) string: NaN == 0 // 返回 false {} == !{} // 單目:[] == fasle // 轉(zhuǎn) boolean: [] == 0 // 轉(zhuǎn) array: "" == 0 // 轉(zhuǎn) string: 0 == 0 // 返回 true [] == ![] [] == [] [] == 0嚴(yán)格比較 (===)
類型不同,直接返回 false
Number 類型判斷:有 NaN 就 false;
特別的 +0 === -0;
最后調(diào)用 SameValueNonNumber
另外 != 和 !== 則是指出了 A != B 與 !(A == B) 是完全等價的。在判斷 !=/!== 時,其實就是在判斷 ==/===.不等關(guān)系
兩邊操作數(shù)調(diào)用 ToPrimitive 轉(zhuǎn)換為 Primitive Value
由于 Primitive Value 出來有 String 和 Number 兩種結(jié)果,分別有不同的比較規(guī)則;
如果兩邊的值都是 String,則 按 code unit 比較,
如果一邊是 Number,則將另一邊也轉(zhuǎn)換為 Number;注意 Number 需要處理 +0/-0/NaN/Infinity 等情況
// 注意轉(zhuǎn)換后為 "45" < "46" // 按字符串規(guī)則比較 最終比較的是 "5".charCodeAt() < "6".charCodeAt() => 53 < 54 // 返回 true [45] < [46] // 同理 [10] < [9] 最后進(jìn)行的是 "10" < "9" 的比較,是字符串之間的筆記,不會轉(zhuǎn)換為數(shù)字間的比較, // 其實最終比較的是 "1".charCodeAt() < "9".charCodeAt() => 49 < 57. [10] < [9]練習(xí)題
// 每個表達(dá)式是 true 還是 false 呢?為啥呢? // 初階 !{} 12 == "12" "false" == false null == undefined // 高階 [] == [] [] == false [] === false [45] == 45 // 終階 [45] < [46] ? [10] < [9] ? {} == !{} {} != {} -0 === +0 NaN === NaN NaN != NaN // 轉(zhuǎn)換條件 轉(zhuǎn)換后類型 結(jié)果 []+[] // String “” [1,2]+[3,4] // String “1,23,4” []+{} // String “[object Object]” [1,2] + {a:1} // String “1,2[object Object]” {}+[] // Number 0 {}+[1] //Number 1 {a:1}+[1,2] // Number NaN {a:1}+{b:2} // Chrome - String “[object Object][object Object]” (背后實現(xiàn)eval) {a:1}+{b:2} // Firefox - Number NaN true+true // Number 2 1+{a:1} // String “1[object Object]”reference
JavaScript 中的隱式類型轉(zhuǎn)換的規(guī)范
JavaScript 運(yùn)算符規(guī)則與隱式類型轉(zhuǎn)換詳解
JavaScript類型:關(guān)于類型,有哪些你不知道的細(xì)節(jié)?
深入淺出弱類型JS的隱式轉(zhuǎn)換
JavaScript字符串間的比較
ecma-sec-relational-operators
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/101673.html
摘要:強(qiáng)制類型轉(zhuǎn)換作為程序員,你一定獲取過當(dāng)前系統(tǒng)的時間戳。比如對于變量而言,此次強(qiáng)制類型轉(zhuǎn)換是隱式的。然而則是非常典型的顯式強(qiáng)制類型轉(zhuǎn)換。隱式強(qiáng)制類型轉(zhuǎn)換大部分被詬病的強(qiáng)制類型轉(zhuǎn)換都是隱式強(qiáng)制類型轉(zhuǎn)換。 JavaScript 強(qiáng)制類型轉(zhuǎn)換 作為 JavaScript 程序員,你一定獲取過當(dāng)前系統(tǒng)的時間戳。在 ES5 引入 Date.now() 靜態(tài)方法之前,下面這段代碼你一定不會陌生: v...
摘要:具體的行為取決于參數(shù)的類型。說到,就不得不提一下方法,方法自帶隱式類型轉(zhuǎn)換,該方法在測試其參數(shù)之前,會先調(diào)用方法將其轉(zhuǎn)換為數(shù)字。全等運(yùn)算符會先進(jìn)行數(shù)據(jù)類型判斷,并且不會發(fā)生隱式類型轉(zhuǎn)換。 類型轉(zhuǎn)換還不行?還非得隱式?這是什么高級玩意? 廢話不多說,我們先上一盤?,額,不對,先看一個例子吧。 3 + true 實際上在大多數(shù)編程語言中,都會認(rèn)為上面這個表達(dá)式是錯誤的。因為布爾表達(dá)式與算術(shù)...
摘要:雖然你可能很驚訝甚至可能懷疑是的但是這都是有語言自己的一個隱式類型轉(zhuǎn)換的套路?;镜碾[式類型轉(zhuǎn)換基本類型的隱式轉(zhuǎn)換這個其實我們使用的最多例如結(jié)果返回的是而不是這就是類型的隱式轉(zhuǎn)換。 基本上所有的語言都有 隱式類型轉(zhuǎn)換 ,但是對于 弱類型語言(JS) 來說 ,隱式類型轉(zhuǎn)換會比 強(qiáng)類型語言(Java) 帶來更大的副作用,有些行為甚至是不可思議的。雖然你可能很驚訝 ,甚至可能懷疑是 JS 的...
摘要:顯示的調(diào)用轉(zhuǎn)換過程稱為顯式強(qiáng)制類型轉(zhuǎn)換,隱式的情況稱為隱式強(qiáng)制類型轉(zhuǎn)換。隱式強(qiáng)制類型轉(zhuǎn)換讓代碼變得晦澀難懂而又便捷而奇妙。事實上,允許在比較中進(jìn)行強(qiáng)制類型轉(zhuǎn)換,而不允許。如果有并且返回基本類型值,就使用該值進(jìn)行強(qiáng)制類型轉(zhuǎn)換。 JavaScript是一種非常靈活的現(xiàn)代編程語言,靈活到使用者極其容易被忽視的它那廣闊的世界以及它帶給我們的無限遐想空間。本文將對JavaScript最最基礎(chǔ)也最...
摘要:下面先看看涉及到的幾個函數(shù)以及他們的轉(zhuǎn)換規(guī)則,這個是需要記憶的內(nèi)容類型轉(zhuǎn)換需要使用到的函數(shù)對于布爾值用到的是對于數(shù)值,用到的是當(dāng)然還有但是對于隱式類型轉(zhuǎn)換的時候,調(diào)用的是前者。 javaScript類型轉(zhuǎn)換規(guī)則 javaScript的類型轉(zhuǎn)換其實一直是很多前端開發(fā)人員很迷的地方,一會兒這里要轉(zhuǎn)換,一會兒那里又要轉(zhuǎn)換,總之就是一個大寫的迷,因為它隱式類型轉(zhuǎn)換的地方實在是太多了。 但其實...
閱讀 1606·2021-11-25 09:43
閱讀 2427·2019-08-30 15:55
閱讀 1517·2019-08-30 13:08
閱讀 2758·2019-08-29 10:59
閱讀 878·2019-08-29 10:54
閱讀 1647·2019-08-26 18:26
閱讀 2632·2019-08-26 13:44
閱讀 2711·2019-08-23 18:36