攻克js類型轉換

關于js中類型轉換一直都沒有梳理清楚组题,這次認真梳理發(fā)現(xiàn)只有三種情況,分別為:

  • 轉換為布爾值
  • 轉換為字符串
  • 轉換為數(shù)字
原始值 轉換目標 結果
number 布爾值 0岳悟、-0、NaN為false,其它均為true
string 布爾值 空字符串(' ')為false贵少,其它均為true
undefined呵俏、null 布爾值 false
引用類型 布爾值 true
原始值 轉換目標 結果
number 字符串 123=>'123'
Boolean、函數(shù)滔灶、Symbol 字符串 function(){} => 'function(){}'
數(shù)組 字符串 [1,2,3]=>'1,2,3'
對象 字符串 '[object Object]'
原始值 轉換目標 結果
string 數(shù)字 '123'=>123
數(shù)組 數(shù)字 空數(shù)組[]=>0,只有一個數(shù)字元素['1']=>1,其它情況NaN
null 數(shù)字 0
除了數(shù)組的引用類型 數(shù)字 NaN
Symbol 數(shù)字 拋錯:Uncaught TypeError: Cannot convert a Symbol value to a number

轉Boolean

在條件判斷時普碎,除了 0、-0录平、NaN麻车、''、undefined斗这、null动猬、false其它所有值都轉為 true,包括所有對象表箭。

對象轉原始類型

對象類型轉換時會調用內置的[[ToPrimitive]] 函數(shù)赁咙,該函數(shù)算法邏輯如下:

  • 如果已經是原始類型,不需要轉換
  • 調用x.valueOf()免钻,如果轉換為基礎類型彼水,就返回轉換的值
  • 調用x.toString(),如果轉換為基礎類型极舔,就返回轉換的值
  • 如果都沒有返回原始類型凤覆,報錯

可以重寫Symbol.toPrimitive,該方法在轉換原始類型是調用優(yōu)先級最高

let a = {
    valueOf () {
        return 0
    },
    toString () {
        //return '1'
    },
    [Symbol.toPrimitive] () {
       return 2
    }
}

1 + a // 3

四則運算符

加法運算符不同于其他幾個運算符拆魏,有幾個特點:

  • 運算中有一方為字符串盯桦,那么另一方也轉換成字符串
  • 如果一方不是字符串或者數(shù)字,那么會將它轉化為數(shù)字或者字符串
1 + '1' // '11'
true + true // 2
1+[1,2,3] // "11,2,3"

??注意這種表達式 'a' + + 'b'

'a' + + 'b' // "aNaN"

技巧:可以通過+ '1'的形式快速獲取number值渤刃,+操作符可以直接把后面的值轉成數(shù)字

對于除了加法的運算符(-俺附、*、/)溪掀,非數(shù)字的轉成數(shù)字進行運算

4 / '2'  // 2
3 * '3'  // 9
3 - {} // NaN

比較運算符

  • 對象,通過toPrimitive方法轉換成基本類型
  • 字符串步鉴,通過unicode 字符索引來比較
  • 布爾值揪胃,轉換成數(shù)字,true=>1, false=>0
let a = {
    valueOf() {
        return 0
    },
    toString() {
        return '2'
    }
}

a > -1 // true, a 是對象氛琢,通過 valueOf 轉換為原始類型再比較值喊递。

對比== 和 ===

對于==來說,如果對比雙方的類型不同阳似,會進行類型轉換骚勘,x == y判斷流程:

  • 首先判斷x、y類型是否相同,相同則直接比較大小(x === y)俏讹,不同則類型轉換繼續(xù)判斷 -->
  • 若x当宴、y為null和undefined,返回true泽疆,否則繼續(xù)判斷 -->
  • 若x户矢、y為字符串和數(shù)字進行比較,將字符串轉換為number殉疼,再繼續(xù)判斷
  • 若x梯浪、y有一方為布爾值,是的話將布爾值轉為number瓢娜,再繼續(xù)判斷
  • 判斷是否有一方為Object挂洛,且另一方為string/number/symbol,是的話將object轉換為原始類型再繼續(xù)判斷

詳情參考:標準文檔

[] == ![] // true眠砾,過程:[] == false -> [] == 0 -> 0 == 0 ->true
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末虏劲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子荠藤,更是在濱河造成了極大的恐慌伙单,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哈肖,死亡現(xiàn)場離奇詭異吻育,居然都是意外死亡,警方通過查閱死者的電腦和手機淤井,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門布疼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人币狠,你說我怎么就攤上這事游两。” “怎么了漩绵?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵贱案,是天一觀的道長。 經常有香客問我止吐,道長宝踪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任碍扔,我火速辦了婚禮瘩燥,結果婚禮上,老公的妹妹穿的比我還像新娘不同。我一直安慰自己厉膀,他們只是感情好溶耘,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著服鹅,像睡著了一般凳兵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菱魔,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天留荔,我揣著相機與錄音,去河邊找鬼澜倦。 笑死聚蝶,一個胖子當著我的面吹牛,可吹牛的內容都是我干的藻治。 我是一名探鬼主播碘勉,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼桩卵!你這毒婦竟也來了验靡?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雏节,失蹤者是張志新(化名)和其女友劉穎胜嗓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钩乍,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡辞州,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了寥粹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片变过。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涝涤,靈堂內的尸體忽然破棺而出媚狰,到底是詐尸還是另有隱情,我是刑警寧澤阔拳,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布崭孤,位于F島的核電站,受9級特大地震影響糊肠,放射性物質發(fā)生泄漏辨宠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一罪针、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧黄伊,春花似錦泪酱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毡惜。三九已至,卻和暖如春斯撮,著一層夾襖步出監(jiān)牢的瞬間经伙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工勿锅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帕膜,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓溢十,卻偏偏與公主長得像垮刹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子张弛,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容