摘要:在網(wǎng)上或面試題中經(jīng)常會(huì)看到一些奇怪的語(yǔ)句,比如在中運(yùn)算符是個(gè)重載運(yùn)算符,可用來(lái)拼接字符串,以及把兩個(gè)數(shù)字相加。至于是哪種情況要看運(yùn)算符兩邊參數(shù)的類型。如何轉(zhuǎn)換在規(guī)范中有詳細(xì)的說(shuō)明,但規(guī)范看起來(lái)是有點(diǎn)費(fèi)勁。不過(guò)目前的知識(shí)足夠回答原先的問(wèn)題了。
在網(wǎng)上或面試題中經(jīng)常會(huì)看到一些“奇怪”的語(yǔ)句,比如
{}+{} // "[object Object][object Object]" {}+[] // 0 []+{} // "[object Object]" []+[] // ""
在Javascript中+運(yùn)算符是個(gè)重載運(yùn)算符,可用來(lái)拼接字符串,以及把兩個(gè)“數(shù)字”相加。至于是哪種情況要看運(yùn)算符兩邊參數(shù)的類型。
在日常的開發(fā)中我們也不會(huì)碰到這么麻煩的事,但弄弄清楚總是好的。在規(guī)范 中巴拉巴拉地說(shuō)了一堆,簡(jiǎn)單來(lái)說(shuō)就是:
1. 對(duì)于原生類型,參數(shù)中只要有一方是字符串,則按字符串連接處理,否則按數(shù)字相加處理,不是數(shù)字的會(huì)先轉(zhuǎn)成數(shù)字再相加。
原生類型有:undefined, null, boolean, number, string。
下面是一些示例:
0 + "1" // "01" null + 1 // 1 true + 1 // 2 false + 1 // 0 undefined + 2 // NaN, 因?yàn)閡ndefined轉(zhuǎn)成Number是NaN
2. 對(duì)于引用類型,則需要先轉(zhuǎn)換成原生類型,再按以上規(guī)則相加。如何轉(zhuǎn)換在規(guī)范中有詳細(xì)的說(shuō)明,但規(guī)范看起來(lái)是有點(diǎn)費(fèi)勁。 簡(jiǎn)單來(lái)說(shuō)就是:默認(rèn)情況下都轉(zhuǎn)化成字符串,要搞特殊的話,請(qǐng)重寫valueOf()方法。
來(lái)個(gè)例子:
function Complex(a, b) { this.a = a; this.b = b; } Complex.prototype.valueOf() { return this.a; } new Complex(2, 3) + new Complex(4, 5); // 6
但由于Js不支持真正的操作符重載,即不能相加得到自定義類型的對(duì)象, 所以以上示例在實(shí)踐代碼中非常少用。
不過(guò)目前的知識(shí)足夠回答原先的問(wèn)題了。但是慢著,{}+[] 為什么和 []+{}不一樣? 這其實(shí)是個(gè)語(yǔ)法問(wèn)題。前者相當(dāng)于:
{} +[]
其實(shí)是兩個(gè)句子, [] 轉(zhuǎn)換成數(shù)字是 0。很容易驗(yàn)證 ({}+[]) === "[object Object]"
+[] // 0
有人可能要問(wèn),那 new Date() 的 valueOf() 不是轉(zhuǎn)換成數(shù)字嗎?為什么相加結(jié)果還是字符串類型呢?
new Date().valueOf(); // 1491904757087 1 + new Date(); // "1Tue Apr 11 2017 18:02:16 GMT+0800 (CST)"
這是Date類做了特殊處理, @@toPrimitive, 默認(rèn)情況下對(duì) Date 的相加以字符串方式連接,但比較時(shí)則會(huì)轉(zhuǎn)換成數(shù)字。
new Date() < new Date("2018-01-01") // true, 現(xiàn)在是2017
將引用類型轉(zhuǎn)換成原生類型在很多操作符中都有用到,比如 <, >, 所以有必要對(duì)其研究一番, 以下js代碼大概描述了其行為。
/** * @param input 即要轉(zhuǎn)換的對(duì)象 * @preferredType 期望轉(zhuǎn)換成的類型,可以是string或number */ function ToPrimitive(input, preferredType) { if (typeof input !== "object") { return input; // 本來(lái)就是原生類型 } var hint = preferredType || "default"; if (typeof input["@@toPrimitive"] === "function") { // @@toPrimitive是個(gè)內(nèi)部方法,這里只是示例說(shuō)明其工作原理 return input["@@toPrimitive"](input, hint); // 這就是為什么Date能特殊處理的原因 } if (hint === "string") { return input.toString(); } return input.valueOf(); }
詳細(xì)的請(qǐng)參考規(guī)范
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/82470.html
摘要:完整清單是中添加,此處不予介紹布爾值用來(lái)表示可能是真或假的值。結(jié)果抽象比較運(yùn)算符在比較它們之前在類型之間進(jìn)行自動(dòng)轉(zhuǎn)換。中的隱式轉(zhuǎn)換稱為強(qiáng)制類型轉(zhuǎn)換,并在規(guī)范中定義。這些內(nèi)置類型可用于在不同類型之間進(jìn)行顯式轉(zhuǎn)換。 翻譯:瘋狂的技術(shù)宅原文:https://www.valentinog.com/bl... 本文首發(fā)微信公眾號(hào):前端先鋒歡迎關(guān)注,每天都給你推送新鮮的前端技術(shù)文章 show...
摘要:和類在開始時(shí)遇到類組件,只是需要有關(guān)類的基礎(chǔ)。畢竟,中的條件呈現(xiàn)僅再次顯示大多數(shù)是而不是特定的任何內(nèi)容。 在我的研討會(huì)期間,更多的材料是關(guān)于JavaScript而不是React。其中大部分歸結(jié)為JavaScript ES6以及功能和語(yǔ)法,但也包括三元運(yùn)算符,語(yǔ)言中的簡(jiǎn)寫版本,此對(duì)象,JavaScript內(nèi)置函數(shù)(map,reduce,filter)或更常識(shí)性的概念,如:可組合性,可重用...
摘要:要理解立即執(zhí)行函數(shù),需要先理解一些函數(shù)的基本概念。函數(shù)表達(dá)式使用關(guān)鍵字聲明一個(gè)函數(shù),但未給函數(shù)命名,最后將匿名函數(shù)賦予一個(gè)變量,叫函數(shù)表達(dá)式,這是最常見的函數(shù)表達(dá)式語(yǔ)法形式。 javascript和其他編程語(yǔ)言相比比較隨意,所以javascript代碼中充滿各種奇葩的寫法,有時(shí)霧里看花,當(dāng)然,能理解各型各色的寫法也是對(duì)javascript語(yǔ)言特性更進(jìn)一步的深入理解。 ( functio...
摘要:來(lái)源編程精解中文第三版翻譯項(xiàng)目原文譯者飛龍協(xié)議自豪地采用谷歌翻譯部分參考了編程精解第版在機(jī)器的表面之下,程序在運(yùn)轉(zhuǎn)。本章將會(huì)介紹程序當(dāng)中的基本元素,包括簡(jiǎn)單的值類型以及值運(yùn)算符。示例中的乘法運(yùn)算符優(yōu)先級(jí)高于加法。 來(lái)源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Values, Types, and Operators 譯者:飛龍 協(xié)議:CC BY-NC...
摘要:多數(shù)運(yùn)算符都是由標(biāo)點(diǎn)符號(hào)表示,比如和。通常會(huì)根據(jù)需要對(duì)操作數(shù)進(jìn)行類型轉(zhuǎn)換左值是一個(gè)古老的屬于,它是指表達(dá)式只能出現(xiàn)在賦值運(yùn)算符的左側(cè)。也稱為嚴(yán)格相等運(yùn)算符,它用來(lái)檢測(cè)兩個(gè)操作數(shù)是否嚴(yán)格相等。運(yùn)算符的檢測(cè)規(guī)則是和運(yùn)算符的求反。 源代碼: https://github.com/RobinQu/Programing-In-Javascript/blob/master/chapters/...
閱讀 2570·2021-11-23 09:51
閱讀 3120·2019-08-30 15:54
閱讀 1071·2019-08-30 14:14
閱讀 3542·2019-08-30 13:59
閱讀 1393·2019-08-29 17:09
閱讀 1468·2019-08-29 16:24
閱讀 2848·2019-08-29 15:43
閱讀 911·2019-08-29 12:45