js 對象轉(zhuǎn)基本類型

對象轉(zhuǎn)基本類型

  1. 對象在轉(zhuǎn)換基本類型時,會調(diào)用 valueOf 和 toString洒沦,并且這兩個方法你是可以重寫的。

  2. 調(diào)用哪個方法价淌,主要是要看這個對象傾向于轉(zhuǎn)換為什么申眼。如果傾向于轉(zhuǎn)換為 Number 類型的,就優(yōu)先調(diào)用 valueOf蝉衣;如果傾向于轉(zhuǎn)換為 String 類型括尸,就只調(diào)用 toString

var obj = {
  toString () {
    console.log('toString')
    return 'string'
  },
  valueOf () {
    console.log('valueOf')
    return 'value'
  }
}

alert(obj) // string
console.log(1 + obj) // 1value
  • 如果重寫了 toString 方法,而沒有重寫 valueOf 方法病毡,則會調(diào)用 toString 方法
var obj = {
  toString () {
    return 'string'
  }
}

console.log(1 + obj) // 1string
  1. 調(diào)用上述兩個方法的時候姻氨,需要 return 原始類型的值 (primitive value)
  • 如果在調(diào)用 valueOf 的時候,返回的不是原始類型的值剪验,就會去調(diào)用 toString
var obj = {
  toString () {
    console.log('toString')
    return 'string'
  },
  valueOf () {
    console.log('valueOf')
    return {}
  }
}

console.log(1 + obj)

// 依次打印出
valueOf
toString
1string
  • 如果返回還不是原始的值肴焊,就會報錯
var obj = {
  toString () {
    console.log('toString')
    return {}
  },
  valueOf () {
    console.log('valueOf')
    return {}
  }
}

console.log(1 + obj)

// 報錯。無法將一個對象轉(zhuǎn)換為原始類型的值
Uncaught TypeError: Cannot convert object to primitive value
  1. 如果有 Symbol.toPrimitive 屬性的話功戚,會優(yōu)先調(diào)用娶眷,它的優(yōu)先級最高
var obj = {
  toString () {
    console.log('toString')
    return {}
  },
  valueOf () {
    console.log('valueOf')
    return {}
  },
  [Symbol.toPrimitive] () {
    console.log('primitive')
    return 'primi'
  }
}

console.log(1 + obj) // 1primi
  • 同樣只能 return 原始類型的值,否則會報和上面所說一樣的錯啸臀。
var obj = {
  toString () {
    console.log('toString')
    return {}
  },
  valueOf () {
    console.log('valueOf')
    return {}
  },
  [Symbol.toPrimitive] () {
    console.log('primitive')
    return {}
  }
}

console.log(1 + obj)

// 報錯 
TypeError: Cannot convert object to primitive value
  1. 其他問題
var obj = {
  toString () {
    console.log('toString')
    return '1'
  },
  valueOf () {
    console.log('valueOf')
    return 2
  }
}

console.log(1 + obj)
console.log('1' + obj)

// 依次輸出
valueOf
3
valueOf
12

按理來說

'1' + obj

這個 + 是傾向于轉(zhuǎn)為轉(zhuǎn)換為字符串類型的(也就是調(diào)用 toString)届宠;但是烁落,它最后卻是調(diào)用 valueOf。

原因在于豌注,對于 + 這個操作符來說伤塌,本身就是代表加法,也就是說轧铁,本來就傾向于轉(zhuǎn)為 number 類型每聪,只不過發(fā)現(xiàn)加號左邊出現(xiàn)字符串,于是乎把它的右邊也轉(zhuǎn)為字符串(也就是調(diào)用 valueOf 后齿风,return 的值再轉(zhuǎn)為字符串)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末药薯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子救斑,更是在濱河造成了極大的恐慌童本,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脸候,死亡現(xiàn)場離奇詭異穷娱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)运沦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門泵额,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茶袒,你說我怎么就攤上這事×构荩” “怎么了薪寓?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長澜共。 經(jīng)常有香客問我向叉,道長,這世上最難降的妖魔是什么嗦董? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任母谎,我火速辦了婚禮,結(jié)果婚禮上京革,老公的妹妹穿的比我還像新娘奇唤。我一直安慰自己,他們只是感情好匹摇,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布咬扇。 她就那樣靜靜地躺著,像睡著了一般廊勃。 火紅的嫁衣襯著肌膚如雪懈贺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音梭灿,去河邊找鬼画侣。 笑死,一個胖子當(dāng)著我的面吹牛堡妒,可吹牛的內(nèi)容都是我干的配乱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼涕蚤,長吁一口氣:“原來是場噩夢啊……” “哼宪卿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起万栅,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤佑钾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后烦粒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體休溶,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年扰她,在試婚紗的時候發(fā)現(xiàn)自己被綠了兽掰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡徒役,死狀恐怖孽尽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忧勿,我是刑警寧澤杉女,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站鸳吸,受9級特大地震影響熏挎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晌砾,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一坎拐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧养匈,春花似錦哼勇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至楣嘁,卻和暖如春磅轻,著一層夾襖步出監(jiān)牢的瞬間珍逸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工聋溜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留谆膳,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓撮躁,卻偏偏與公主長得像漱病,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子把曼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

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

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)杨帽,也就是一...
    悟名先生閱讀 4,131評論 0 13
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,216評論 0 4
  • ??引用類型的值(對象)是引用類型的一個實例注盈。 ??在 ECMAscript 中,引用類型是一種數(shù)據(jù)結(jié)構(gòu)叙赚,用于將數(shù)...
    霜天曉閱讀 1,042評論 0 1
  • 1老客、js數(shù)據(jù)類型 js中有7種數(shù)據(jù)類型,可以分為兩類:原始類型震叮、對象類型: 基礎(chǔ)類型(原始值): Undefine...
    好奇男孩閱讀 9,794評論 1 16
  • 我對你說胧砰, 我養(yǎng)了只長尾巴的兔子, 你來看看吧苇瓣! 你真的來了尉间, 我枕著你的胳膊, 躺在你旁邊击罪。 我還記得哲嘲, 天亮未...
    oh塵埃閱讀 280評論 1 5