js類型轉(zhuǎn)換

javaScript類型轉(zhuǎn)換

標(biāo)簽(空格分隔): 未分類


隱式轉(zhuǎn)換

當(dāng)遇到以下幾種情況,JavaScript會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型:

不同類型的數(shù)據(jù)進(jìn)行互相運(yùn)算
對(duì)非布爾值類型的數(shù)據(jù)求布爾值
對(duì)非數(shù)值類型的數(shù)據(jù)使用一元運(yùn)算符(即 "+" 和 "-")

注意事項(xiàng):
1.一個(gè)是number一個(gè)是string時(shí)金刁,會(huì)嘗試將string轉(zhuǎn)換為number,但+除外

2.undefined與null相等,但不恒等(===)
3.“==”會(huì)對(duì)不同類型值進(jìn)行類型轉(zhuǎn)換再判斷,“===”則不會(huì)。它會(huì)先判斷兩邊的值類型晰赞,類型不匹配時(shí)直接為false陈醒。
4.對(duì)于0、空字符串的判斷或杠,建議使用 “===” 。

5.隱式轉(zhuǎn)換將boolean轉(zhuǎn)換為number宣蔚,0或1
6.隱式轉(zhuǎn)換將Object轉(zhuǎn)換成number或string廷痘,取決于另外一個(gè)對(duì)比量的類型


隱式轉(zhuǎn)換為 Boolean

大多數(shù)在做 if 判斷時(shí)會(huì)用到,這里只需記住六個(gè)轉(zhuǎn)換為 false件已,其它全部為 true

null
undefined
NaN
''
-0
+0

隱式轉(zhuǎn)換為 String

字符串的自動(dòng)轉(zhuǎn)換笋额,主要發(fā)生在加法運(yùn)算時(shí)。當(dāng)一個(gè)值為字符串篷扩,另一個(gè)值為非字符串兄猩,則后者轉(zhuǎn)為字符串。

'1' + 2  // '12'
'1' + true  // "1true"
'1' + false  // "1false"
'1' + {}  // "1[object Object]"
'1' + []  // "1"
'1' + function (){}  // "1function (){}"
'1' + undefined  // "1undefined"
'1' + null  // "1null"

隱式轉(zhuǎn)換為 Number

除了加法運(yùn)算符有可能把運(yùn)算子轉(zhuǎn)為字符串,其他運(yùn)算符都會(huì)把兩側(cè)的運(yùn)算子自動(dòng)轉(zhuǎn)成數(shù)值

'5' - '2'  // 3
'5' * '2'  // 10
true - 1  // 0
false - 1  // -1
'1' - 1  // 0
'5' * []  // 0
false / '5'  // 0
'abc' - 1  // NaN
+'abc'  // NaN
-'abc'  // NaN
+true  // 1
-false  // 0

關(guān)系運(yùn)算符
什么是關(guān)系運(yùn)算符
用于進(jìn)行比較的運(yùn)算符稱為關(guān)系運(yùn)算符枢冤;大于(>),小于(<),等于(==),大于等于(>=)小于等于(<=);不等于(鸠姨!=)全等(===)不全等(!==)淹真;
比較的運(yùn)算法則
如果兩個(gè)都是Number類型讶迁,則互相比較;
如果兩個(gè)都是數(shù)值字符串則比較第一位字符核蘸;
如果兩個(gè)都是字符串類型巍糯,則比較ASCII編碼;
如果有一個(gè)是字符串?dāng)?shù)值類型客扎,則轉(zhuǎn)為數(shù)值然后比較祟峦;
如果有一個(gè)是對(duì)象,則調(diào)用toString或Valueof徙鱼;

        在相等和不等的比較上宅楞,如果操作數(shù)是非數(shù)值,則遵循以下規(guī)則
        一個(gè)操作數(shù)是布爾值袱吆,則比較之前將其準(zhǔn)換為數(shù)值厌衙,false轉(zhuǎn)0,true轉(zhuǎn)為1绞绒;
        一個(gè)操作數(shù)是字符串婶希,則比較之前將其準(zhǔn)換為數(shù)值再比較;
        一個(gè)操作數(shù)是對(duì)象处铛,則先調(diào)用valueOf()或者toStirng()方法后在和返回值做比較
        不需要任何轉(zhuǎn)換的情況下饲趋,null和undefined是相等的拐揭;
        一個(gè)操作數(shù)是NaN,則==返回false !=返回true;并且NaN和自身不等撤蟆;
        兩個(gè)操作數(shù)都是對(duì)象,則比較他們是否是同一個(gè)對(duì)象堂污,如果都指向同一個(gè)對(duì)象則返回true家肯;
        在全等和不等的判斷上,只有值和類型都想等盟猖,才返回true;
        **注意undefined在比較時(shí)不會(huì)自動(dòng)準(zhǔn)換讨衣,而字符串可以;

'''
面試題:
true == 3 //false 如果有一個(gè)是布爾值式镐,則把他轉(zhuǎn)換成數(shù)值然后再比較反镇;
'''

隱式轉(zhuǎn)換的基礎(chǔ)表現(xiàn)都在這了,強(qiáng)調(diào)的是這些轉(zhuǎn)換的背后都伴隨著強(qiáng)制轉(zhuǎn)換娘汞,使用 Boolean歹茶、Number 和 String。

實(shí)例及思維導(dǎo)圖

![加法運(yùn)算符] (http://d47ef1ca.wiz03.com/share/resources/a610f6dd-3fa8-4a79-8069-f2af6c315a7b/index_files/0bca5f1422a35b60a559f07a5c6344bb.png)

除法操作符


強(qiáng)制轉(zhuǎn)換

看到上面例子也許你已經(jīng)有些許疑問(wèn)了,比如上面的這個(gè) '1' + {} 怎么就輸出 1[object Object] 了呢

如上面強(qiáng)調(diào)的惊豺,你會(huì)猜測(cè)首先執(zhí)行 String({}) 得到 "[object Object]" 燎孟,然后再字符串拼接,是的我們總能得到轉(zhuǎn)換背后的實(shí)現(xiàn)原理尸昧,其實(shí)真實(shí)原理要比這個(gè)復(fù)雜揩页,見(jiàn)下文

強(qiáng)制轉(zhuǎn)換為 Boolean

這里略過(guò)因?yàn)榕c隱式轉(zhuǎn)換相同,切記 []烹俗、{} 都轉(zhuǎn)換成 true

強(qiáng)制轉(zhuǎn)換為 String

基本類型的轉(zhuǎn)換結(jié)果與隱式轉(zhuǎn)換相同爆侣,這里說(shuō)一下對(duì)象的轉(zhuǎn)換,加深上面引用例子的解析

對(duì)象轉(zhuǎn)換字符串分成三步

1.先調(diào)用toString方法衷蜓,如果toString方法返回的是原始類型的值累提,則對(duì)該值使用String方法,不再進(jìn)行以下步驟
2.如果toString方法返回的是復(fù)合類型的值磁浇,再調(diào)用valueOf方法斋陪,如果valueOf方法返回的是原始類型的值,則對(duì)該值使用String方法置吓,不再進(jìn)行以下步驟
3.如果valueOf方法返回的是復(fù)合類型的值无虚,則報(bào)錯(cuò)
再分解這個(gè)例子

String({})
// "[object Object]"
上面代碼相當(dāng)于下面這樣

String({}.toString())
// "[object Object]"
如果 toString 方法和 valueOf 方法,返回的都不是原始類型的值衍锚,則 String 方法報(bào)錯(cuò)

var obj = {
  valueOf: function () {
    console.log("valueOf");
    return {};
  },
  toString: function () {
    console.log("toString");
    return {};
  }
};

String(obj)
// TypeError: Cannot convert object to primitive value

我們不難看出可以對(duì) toString 方法和 valueOf 方法進(jìn)行改寫(xiě)友题,測(cè)試其先后運(yùn)行的順序也簡(jiǎn)單的多

String({toString:function(){return 3;}})
// "3"

String({valueOf:function (){return 2;}})
// "[object Object]"

String({valueOf:function (){return 2;},toString:function(){return 3;}})
// "3"

結(jié)果表示toString方法先于valueOf方法執(zhí)行

強(qiáng)制轉(zhuǎn)換為 Number

基本類型轉(zhuǎn)換如下

Number("123") // 123

Number("123abc") // NaN

Number("") // 0

Number(false) // 0

Number(undefined) // NaN

Number(null) // 0

對(duì)象轉(zhuǎn)換一樣要復(fù)雜些,與 String 唯一不同的就是 valueOf 方法在前戴质, toString 方法在后度宦,其它見(jiàn)上文例子。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末告匠,一起剝皮案震驚了整個(gè)濱河市戈抄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌后专,老刑警劉巖划鸽,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異戚哎,居然都是意外死亡裸诽,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)型凳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丈冬,“玉大人,你說(shuō)我怎么就攤上這事甘畅」∪铮” “怎么了实夹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)粒梦。 經(jīng)常有香客問(wèn)我亮航,道長(zhǎng),這世上最難降的妖魔是什么匀们? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任缴淋,我火速辦了婚禮,結(jié)果婚禮上泄朴,老公的妹妹穿的比我還像新娘重抖。我一直安慰自己,他們只是感情好祖灰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布钟沛。 她就那樣靜靜地躺著,像睡著了一般局扶。 火紅的嫁衣襯著肌膚如雪恨统。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天三妈,我揣著相機(jī)與錄音畜埋,去河邊找鬼。 笑死畴蒲,一個(gè)胖子當(dāng)著我的面吹牛悠鞍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播模燥,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼咖祭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蔫骂?” 一聲冷哼從身側(cè)響起么翰,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纠吴,沒(méi)想到半個(gè)月后硬鞍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體慧瘤,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戴已,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锅减。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糖儡。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖怔匣,靈堂內(nèi)的尸體忽然破棺而出握联,到底是詐尸還是另有隱情桦沉,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布金闽,位于F島的核電站纯露,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏代芜。R本人自食惡果不足惜埠褪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挤庇。 院中可真熱鬧钞速,春花似錦、人聲如沸嫡秕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昆咽。三九已至驾凶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掷酗,已是汗流浹背狭郑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汇在,地道東北人翰萨。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像糕殉,于是被迫代替她去往敵國(guó)和親亩鬼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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

  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line)阿蝶,也就是一...
    悟名先生閱讀 4,131評(píng)論 0 13
  • 寫(xiě)在前面的話 近期刷了點(diǎn)js的面試題雳锋,發(fā)現(xiàn)很多基礎(chǔ)知識(shí)已經(jīng)模糊,于是重新回去看了一下《javascript權(quán)威指南...
    栗子酥小小閱讀 780評(píng)論 0 0
  • 有一道面試題是: 實(shí)現(xiàn)一個(gè)函數(shù)羡洁,運(yùn)算結(jié)果可以滿足如下預(yù)期結(jié)果:add(1)(2) //3add(1,2,3)(10...
    Wonder233閱讀 222評(píng)論 0 0
  • 很久之前玷过,看到過(guò)這樣一種判斷 當(dāng)時(shí)覺(jué)得很神奇,翻了些博客筑煮,但也似懂非懂辛蚊。今天翻看博客的時(shí)候,偶然又看見(jiàn)了它真仲,感覺(jué)跟...
    ebfc7d0362e4閱讀 614評(píng)論 0 5
  • 我做的事情只有一個(gè)目的秸应,就是將準(zhǔn)確的虑凛、真實(shí)的碑宴、純粹的飲食內(nèi)容推給真正喜愛(ài)吃食的你。 我是裸食桑谍,愿你喜歡延柠。 這些年,...
    裸食閱讀 999評(píng)論 4 6