JS 中的類(lèi)型轉(zhuǎn)換

參考: winter 的重學(xué)前端


字符串到數(shù)字

使用 Number() 轉(zhuǎn)換

Number() 支持十進(jìn)制彻况、二進(jìn)制裆泳、八進(jìn)制和十六進(jìn)制敞掘,和科學(xué)計(jì)數(shù)法

Number('123') // 123    十進(jìn)制
Number('0b111') // 7    二進(jìn)制
Number('0o13') // 11    八進(jìn)制
Number('0xc') // 12     十六進(jìn)制
Number('2e3') // 2000   科學(xué)計(jì)數(shù)法
Number('123ab') // NaN  出現(xiàn)非數(shù)字字符

parseInt() 和 Number() 的區(qū)別

parseIntparseFloat 并不使用上述轉(zhuǎn)換規(guī)則刊侯,所以支持的語(yǔ)法跟這里不盡相同宾娜。在不傳入第二個(gè)參數(shù)的情況下,parseInt只支持16進(jìn)制前綴“0x”吩谦,而且會(huì)忽略非數(shù)字字符鸳谜,也不支持科學(xué)計(jì)數(shù)法。多數(shù)情況下 Number 是比 parseIntparseFloat更好的選擇式廷。

數(shù)字到字符串

  • 在較小的范圍內(nèi)咐扭,數(shù)字到字符串的轉(zhuǎn)換是完全符合你直覺(jué)的十進(jìn)制表示。
  • Number絕對(duì)值較大或者較小時(shí)滑废,字符串表示則是使用科學(xué)計(jì)數(shù)法表示蝗肪。(可能是避免產(chǎn)生的字符串太長(zhǎng))

基本類(lèi)型裝箱轉(zhuǎn)換為對(duì)象

每一種基本類(lèi)型Number、String蠕趁、Boolean薛闪、Symbol在對(duì)象中都有對(duì)應(yīng)的類(lèi)。所謂裝箱轉(zhuǎn)換俺陋,正是把基本類(lèi)型轉(zhuǎn)換為對(duì)應(yīng)的對(duì)象豁延。

怎么顯式轉(zhuǎn)換呢昙篙?

直接使用 new 對(duì)應(yīng)的類(lèi)。之后就能使用對(duì)應(yīng) 的方法了诱咏。

new Number(123) // Number {123}
new String("abc") // String {"abc"}
new Boolean(true) // Boolean {true}

使用 . 運(yùn)算符產(chǎn)生臨時(shí)對(duì)象

// . 運(yùn)算符 產(chǎn)生一個(gè)臨時(shí)對(duì)象苔可,使得 "123" 能夠使用對(duì)象的方法
"123".length // 3

上面的示例中,. 運(yùn)算符的作用大致相當(dāng)于 new String()

var strObj = new String("123")
strObj.length // 3

特殊的 Symbol

Symbol 對(duì)象不能直接 new 出來(lái)胰苏。但可以使用內(nèi)置的 Object 函數(shù)硕蛹,我們可以在JavaScript代碼中顯式調(diào)用裝箱能力。

  var symbolObject = Object(Symbol("a"))
  typeof symbolObject // "object"

判別裝箱轉(zhuǎn)換后的對(duì)象對(duì)應(yīng)的基本類(lèi)型

每一類(lèi)裝箱對(duì)象皆有私有的 Class 屬性硕并,這些屬性可以用 Object.prototype.toString 獲取

var strObj = new String('abc') // strObj 是一個(gè)對(duì)象
var symObj = Object(Symbol('sym')) // symObj 是一個(gè)對(duì)象
Object.prototype.toString.call(strObj) // "[object String]"     
Object.prototype.toString.call(symObj) // "[object Symbol]"

在 JavaScript 中法焰,沒(méi)有任何方法可以更改私有的 Class 屬性,因此Object.prototype.toString是可以準(zhǔn)確識(shí)別對(duì)象對(duì)應(yīng)的基本類(lèi)型的方法倔毙,它比 instanceof 更加準(zhǔn)確埃仪。

對(duì)象拆箱轉(zhuǎn)換為基本類(lèi)型

在JavaScript標(biāo)準(zhǔn)中,規(guī)定了 ToPrimitive 函數(shù)陕赃,它是對(duì)象類(lèi)型到基本類(lèi)型的轉(zhuǎn)換(即卵蛉,拆箱轉(zhuǎn)換)。

對(duì)象到 String 和 Number 的轉(zhuǎn)換都遵循“先拆箱再轉(zhuǎn)換”的規(guī)則么库。通過(guò)拆箱轉(zhuǎn)換傻丝,把對(duì)象變成基本類(lèi)型,再?gòu)幕绢?lèi)型轉(zhuǎn)換為對(duì)應(yīng)的 String 或者 Number诉儒。

拆箱轉(zhuǎn)換過(guò)程

拆箱轉(zhuǎn)換會(huì)嘗試調(diào)用 valueOf 和 toString 來(lái)獲得拆箱后的基本類(lèi)型葡缰。如果 valueOf 和 toString 都不存在,或者沒(méi)有返回基本類(lèi)型忱反,則會(huì)產(chǎn)生類(lèi)型錯(cuò)誤 TypeError泛释。默認(rèn)先調(diào)用 valueOf ,如果valueOf 返回的值不對(duì)再調(diào)用toString温算,依然不對(duì)就會(huì)報(bào)錯(cuò)怜校。

var o = {
        valueOf : () => {console.log("valueOf"); return {} },
        toString : () => {console.log("toString"); return {} },
}
o * 2  // valueOf  // toString  // TypeError

覆蓋拆箱轉(zhuǎn)換默認(rèn)行為

通過(guò)顯式指定對(duì)象的 toPrimitive Symbol來(lái)覆蓋原有的行為。

o[Symbol.toPrimitive] = () => {
    console.log("toPrimitive")
    return "hello"
}
o + '' // 'hello'

typeof 結(jié)果與運(yùn)行時(shí)類(lèi)型對(duì)比

typeof結(jié)果與運(yùn)行時(shí)類(lèi)型對(duì)比.png

永遠(yuǎn)不用隱式轉(zhuǎn)換

規(guī)則復(fù)雜注竿,不要浪費(fèi)寶貴的精力去記憶這種東西茄茁。需要轉(zhuǎn)換的時(shí)候,應(yīng)該用顯式轉(zhuǎn)換巩割,不要省這點(diǎn)功夫胰丁。
真要用,用的時(shí)候再上網(wǎng)查

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末喂分,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子机蔗,更是在濱河造成了極大的恐慌蒲祈,老刑警劉巖甘萧,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異梆掸,居然都是意外死亡扬卷,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)酸钦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)怪得,“玉大人,你說(shuō)我怎么就攤上這事卑硫⊥搅担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵欢伏,是天一觀的道長(zhǎng)入挣。 經(jīng)常有香客問(wèn)我,道長(zhǎng)硝拧,這世上最難降的妖魔是什么径筏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮障陶,結(jié)果婚禮上滋恬,老公的妹妹穿的比我還像新娘。我一直安慰自己抱究,他們只是感情好恢氯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著媳维,像睡著了一般酿雪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侄刽,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天指黎,我揣著相機(jī)與錄音,去河邊找鬼州丹。 笑死醋安,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的墓毒。 我是一名探鬼主播吓揪,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼所计!你這毒婦竟也來(lái)了柠辞?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤主胧,失蹤者是張志新(化名)和其女友劉穎叭首,沒(méi)想到半個(gè)月后习勤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焙格,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年眷唉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛤虐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荞驴,死狀恐怖熊楼,靈堂內(nèi)的尸體忽然破棺而出鲫骗,到底是詐尸還是另有隱情枕磁,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布淘衙,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏做修。R本人自食惡果不足惜饰及,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一绘梦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧榄棵,春花似錦潘拱、人聲如沸疹鳄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瘪弓。三九已至,卻和暖如春盔腔,著一層夾襖步出監(jiān)牢的瞬間杠茬,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工弛随, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓢喉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓舀透,卻偏偏與公主長(zhǎng)得像栓票,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 在js中數(shù)據(jù)轉(zhuǎn)換分為3種:隱式類(lèi)型轉(zhuǎn)換走贪,強(qiáng)制類(lèi)型轉(zhuǎn)換佛猛,函數(shù)轉(zhuǎn)換 1.隱式類(lèi)型轉(zhuǎn)換 (1):運(yùn)算符轉(zhuǎn)換 js中的值在...
    邵小懶閱讀 397評(píng)論 0 2
  • JS是弱類(lèi)型動(dòng)態(tài)語(yǔ)言,自然而然存在大量的類(lèi)型轉(zhuǎn)換的場(chǎng)景坠狡,有些是顯式的更多的則是隱式的继找,并且有些場(chǎng)景轉(zhuǎn)換的規(guī)則十分復(fù)...
    1海內(nèi)無(wú)雙1閱讀 301評(píng)論 0 0
  • [js中的類(lèi)型轉(zhuǎn)換] 先介紹一下 typeof 的使用方法: typeof(mix) 或者 typeof ...
    LikySis閱讀 192評(píng)論 0 0
  • js有5種基本數(shù)據(jù)類(lèi)型:Number String Boolean Null Undefinde一...
    kallenqi閱讀 165評(píng)論 0 6
  • 昨天用到銀行卡,打開(kāi)錢(qián)包逃沿,里里外外翻了幾遍沒(méi)有找到婴渡。突然意識(shí)到可能是一周前取款的時(shí)候忘記退卡了。還好并沒(méi)有損失什么...
    心敘楊麟閱讀 983評(píng)論 3 20