JS 類型轉換

原文

有意思的 JavaScript

640.jpeg

原始值到原始值的轉換

  1. 原始值轉化為布爾值
    所有的假值(undefined熊咽、null莫鸭、0、-0横殴、NaN被因、'')會被轉化為 false,其他都會本轉化為 true衫仑。

  2. 原始值轉化為字符串
    都相當于原始值 + ""

  3. 原始值轉為數(shù)字

    + '66' // 66
    + ' 6 7 ' // NaN
    
    • 布爾值轉數(shù)字:true -> 1氏身,false -> 0
    • 字符串轉數(shù)字:以數(shù)字表示的字符串可以直接轉為字符串,如果字符串頭尾有空格會忽略惑畴,但是空格在中間蛋欣,轉換結果就是 NaN。

原始值到對象的轉換

  • null 和 undefined 轉對象直接拋異常如贷。
  • 原始值通過調用 String()陷虎、Number()、Bollean() 構造函數(shù)杠袱,轉換為他們各自的包裝對象尚猿。

對象到原始值的轉換

  1. 對象轉為布爾都為 true。
  2. 對象到字符串
    • 如果對象有 toString() 方法楣富,就調用 toString() 方法凿掂。如果該方法返回原始值,就將這個值轉化為字符串纹蝴。
    • 如過對象沒有 toString() 方法或者該方法返回的不是原始值庄萎,就會調用該對象的 valueOf() 方法。如果存在就調用這個方法塘安,如果返回值是原始值糠涛,就轉化為字符串。
    • 否則就報錯兼犯。
  3. 對象到數(shù)字
    • 對象轉化為數(shù)字做了跟對象轉化為字符串做了相同的事情忍捡,不同的是后者先調用 valueOf() 方法集漾,如果調用失敗或者返回不是原始值,就調用 toString() 方法砸脊。
  4. 補充具篇。一些常用內(nèi)置對象 toString 方法 和 valueOf 的轉換規(guī)則
    • toString 相關
      640.jpeg
    • valueOf() 相關
      640.jpeg

== 運算符如何進行類型轉換

  1. 如果一個值是 null,另一個值是 undefined凌埂,則相等
  2. 如果一個是字符串栽连,另一個值是數(shù)字,則把字符串轉換成數(shù)字侨舆,進行比較
  3. 如果一個是對象秒紧,則把 true 轉換成 1 再進行比較;如果任意值是 false挨下,則把 false 轉換成 0 再進行比較
  4. 如果一個是對象熔恢,另一個是數(shù)值或字符串,把對象轉換成基礎類型的值再比較臭笆。對象轉換成基礎類型叙淌,利用他的 toString 或者 valueOf 方法。 js 核心內(nèi)置類愁铺,會嘗試 valueOf 先于 toString (可以理解為對象優(yōu)先轉換成數(shù)字)鹰霍,例外的是 Date, Date 利用的是 toString 轉換茵乱。非 js 核心的對象茂洒,通過自己的實現(xiàn)中定義的方法轉換成原始值。

+ 運算符如何進行類型轉化

  1. 如果作為一元運算符就是轉化為數(shù)字瓶竭,常常用來將字符串轉化為數(shù)字
    + '2' // 2
    2 + false // 2
    
  2. 如果作為二元運算符就有兩種轉換方式
    • 兩邊如果有字符串督勺,另一邊會轉化為字符串進行相加。
    • 如果沒有字符串斤贰,兩邊都會轉化為數(shù)字進行相加智哀,對象也根據(jù)前面的方法轉化為原始值數(shù)字。
    • 如果其中的一個操作數(shù)是對象荧恍,則將對象轉換成原始值瓷叫,日期對象會通過 toString() 方法進行轉換,其他對象通過 valueOf() 方法進行轉換送巡,但是大多數(shù)方法都是不具備可用的 valueOf() 方法摹菠,所以還是會通過 toString() 方法執(zhí)行轉換。

流程圖如下:
640.png

解析

(! + [] + [] + ! []).length // 9

運算順序:


640.png
  1. ![]: [] 轉化布爾值的時候會轉化為 true授艰,所以轉化為 false辨嗽。+[] :加號作為一元操作符會被轉化為數(shù)字 0世落,所以結果為:
(! 0 + [] + false).length
  1. !0true淮腾,[] 在二元操作符中會被轉化為 ''糟需,
(true + '' + false).length
  1. 結果
('truefalse').length
《JavaScript權威指南》中類型轉換表格
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谷朝,隨后出現(xiàn)的幾起案子洲押,更是在濱河造成了極大的恐慌,老刑警劉巖圆凰,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杈帐,死亡現(xiàn)場離奇詭異,居然都是意外死亡专钉,警方通過查閱死者的電腦和手機挑童,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跃须,“玉大人站叼,你說我怎么就攤上這事」矫瘢” “怎么了尽楔?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長第练。 經(jīng)常有香客問我阔馋,道長,這世上最難降的妖魔是什么娇掏? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任呕寝,我火速辦了婚禮,結果婚禮上婴梧,老公的妹妹穿的比我還像新娘壁涎。我一直安慰自己,他們只是感情好志秃,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布怔球。 她就那樣靜靜地躺著,像睡著了一般浮还。 火紅的嫁衣襯著肌膚如雪竟坛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天钧舌,我揣著相機與錄音担汤,去河邊找鬼。 笑死洼冻,一個胖子當著我的面吹牛崭歧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撞牢,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼率碾,長吁一口氣:“原來是場噩夢啊……” “哼叔营!你這毒婦竟也來了?” 一聲冷哼從身側響起所宰,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤绒尊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后仔粥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婴谱,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年躯泰,在試婚紗的時候發(fā)現(xiàn)自己被綠了谭羔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡麦向,死狀恐怖口糕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情磕蛇,我是刑警寧澤景描,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站秀撇,受9級特大地震影響超棺,放射性物質發(fā)生泄漏。R本人自食惡果不足惜呵燕,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一棠绘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧再扭,春花似錦氧苍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至罢荡,卻和暖如春赡突,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背区赵。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工惭缰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笼才。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓漱受,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骡送。 傳聞我的和親對象是個殘疾皇子昂羡,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 寫在前面的話 近期刷了點js的面試題絮记,發(fā)現(xiàn)很多基礎知識已經(jīng)模糊,于是重新回去看了一下《javascript權威指南...
    栗子酥小小閱讀 780評論 0 0
  • 很久之前紧憾,看到過這樣一種判斷 當時覺得很神奇到千,翻了些博客昌渤,但也似懂非懂赴穗。今天翻看博客的時候,偶然又看見了它膀息,感覺跟...
    ebfc7d0362e4閱讀 614評論 0 5
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)般眉,也就是一...
    悟名先生閱讀 4,132評論 0 13
  • 來源:一篇文章搞定JS類型轉換作者:老姚 為啥要說這個東西?一道面試題就給我去說它的動機潜支。題如下: 運行結果是tr...
    極樂君閱讀 569評論 0 12
  • 憋了好久冗酿,終于完成一份商業(yè)計劃書的草稿埠对,我想起Facebook高效工作指南中有一句話:做完事情,要勝于完美收工裁替。所...
    潘軍彪閱讀 2,500評論 0 1