有意思的 JavaScript
原始值到原始值的轉換
原始值轉化為布爾值
所有的假值(undefined熊咽、null莫鸭、0、-0横殴、NaN被因、'')會被轉化為 false,其他都會本轉化為 true衫仑。原始值轉化為字符串
都相當于原始值 + ""-
原始值轉為數(shù)字
+ '66' // 66 + ' 6 7 ' // NaN
- 布爾值轉數(shù)字:true -> 1氏身,false -> 0
- 字符串轉數(shù)字:以數(shù)字表示的字符串可以直接轉為字符串,如果字符串頭尾有空格會忽略惑畴,但是空格在中間蛋欣,轉換結果就是 NaN。
原始值到對象的轉換
- null 和 undefined 轉對象直接拋異常如贷。
- 原始值通過調用 String()陷虎、Number()、Bollean() 構造函數(shù)杠袱,轉換為他們各自的包裝對象尚猿。
對象到原始值的轉換
- 對象轉為布爾都為 true。
- 對象到字符串
- 如果對象有 toString() 方法楣富,就調用 toString() 方法凿掂。如果該方法返回原始值,就將這個值轉化為字符串纹蝴。
- 如過對象沒有 toString() 方法或者該方法返回的不是原始值庄萎,就會調用該對象的 valueOf() 方法。如果存在就調用這個方法塘安,如果返回值是原始值糠涛,就轉化為字符串。
- 否則就報錯兼犯。
- 對象到數(shù)字
- 對象轉化為數(shù)字做了跟對象轉化為字符串做了相同的事情忍捡,不同的是后者先調用 valueOf() 方法集漾,如果調用失敗或者返回不是原始值,就調用 toString() 方法砸脊。
- 補充具篇。一些常用內(nèi)置對象 toString 方法 和 valueOf 的轉換規(guī)則
-
toString 相關
-
valueOf() 相關
-
toString 相關
== 運算符如何進行類型轉換
- 如果一個值是 null,另一個值是 undefined凌埂,則相等
- 如果一個是字符串栽连,另一個值是數(shù)字,則把字符串轉換成數(shù)字侨舆,進行比較
- 如果一個是對象秒紧,則把 true 轉換成 1 再進行比較;如果任意值是 false挨下,則把 false 轉換成 0 再進行比較
- 如果一個是對象熔恢,另一個是數(shù)值或字符串,把對象轉換成基礎類型的值再比較臭笆。對象轉換成基礎類型叙淌,利用他的 toString 或者 valueOf 方法。 js 核心內(nèi)置類愁铺,會嘗試 valueOf 先于 toString (可以理解為對象優(yōu)先轉換成數(shù)字)鹰霍,例外的是 Date, Date 利用的是 toString 轉換茵乱。非 js 核心的對象茂洒,通過自己的實現(xiàn)中定義的方法轉換成原始值。
+ 運算符如何進行類型轉化
- 如果作為一元運算符就是轉化為數(shù)字瓶竭,常常用來將字符串轉化為數(shù)字
+ '2' // 2 2 + false // 2
- 如果作為二元運算符就有兩種轉換方式
- 兩邊如果有字符串督勺,另一邊會轉化為字符串進行相加。
- 如果沒有字符串斤贰,兩邊都會轉化為數(shù)字進行相加智哀,對象也根據(jù)前面的方法轉化為原始值數(shù)字。
- 如果其中的一個操作數(shù)是對象荧恍,則將對象轉換成原始值瓷叫,日期對象會通過 toString() 方法進行轉換,其他對象通過 valueOf() 方法進行轉換送巡,但是大多數(shù)方法都是不具備可用的 valueOf() 方法摹菠,所以還是會通過 toString() 方法執(zhí)行轉換。
解析
(! + [] + [] + ! []).length // 9
運算順序:
-
![]
: [] 轉化布爾值的時候會轉化為true
授艰,所以轉化為false
辨嗽。+[]
:加號作為一元操作符會被轉化為數(shù)字 0世落,所以結果為:
(! 0 + [] + false).length
-
!0
為true
淮腾,[]
在二元操作符中會被轉化為''
糟需,
(true + '' + false).length
- 結果
('truefalse').length