摘要:數(shù)字和解釋因?yàn)闆]有任何一個(gè)操作數(shù)是字符串,將轉(zhuǎn)換為一個(gè)數(shù)字做數(shù)字加法運(yùn)算因?yàn)闆]有操作數(shù)是對(duì)象或字符串,將轉(zhuǎn)換為。結(jié)論以避免潛在的問題,不使用加法運(yùn)算符處理對(duì)象,除非你清楚地使用或方法。
前端學(xué)習(xí):教程&模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試資源匯總
JavaScript一路走來,備受爭議,與其說它備受爭議,不如說它不夠完美。不夠完美?那完美了還得了,它的強(qiáng)大你還沒體會(huì)到嗎?它是如此的靈活,當(dāng)然隨之而來的便是開發(fā)的代價(jià),它不像強(qiáng)類型語言那樣規(guī)規(guī)矩矩,今天就說說這個(gè)加法運(yùn)算符。當(dāng)然,這個(gè)不是之前的溫故,不是我說,隨意翻譯,順便分享,后附原文。
這里不講+轉(zhuǎn)換類型,詳見第四章運(yùn)算符詳解
本職工作:加法運(yùn)算符var result = 10 + 5; // number + number = number (addition) // 15
關(guān)于運(yùn)算符的學(xué)習(xí)可參考:運(yùn)算符詳解
勝任工作:連接字符串var result = "Hello, " + "World!"; // string + string = string (concatenation) // "Hello, World!"
JavaScript允許我們在object、array、null or undefined上使用操作符。那我們來看看使用的規(guī)則和細(xì)節(jié)。
轉(zhuǎn)換規(guī)則operand + operand = result
如果操作數(shù)中有一個(gè)是對(duì)象,它會(huì)被轉(zhuǎn)換為原始值(string、number or boolean)
如果操作數(shù)中有一個(gè)是字符串,第二個(gè)操作數(shù)將轉(zhuǎn)換成字符串,并且連接在一起轉(zhuǎn)換為字符串
在其它情況之下,兩個(gè)操作數(shù)轉(zhuǎn)換為數(shù)字并執(zhí)行加法運(yùn)算
如果兩個(gè)運(yùn)算數(shù)是原始類型,則檢查如果至少一個(gè)操作數(shù)是字符串的話,就把它們當(dāng)字符串連接。在其他情況下,它會(huì)把他們都當(dāng)數(shù)字,然后轉(zhuǎn)化為數(shù)字相加的總和。
對(duì)象轉(zhuǎn)換規(guī)則如果對(duì)象類型是一個(gè)Date,使用toString()方法
在其它情況下使用valueOf()方法,返回一個(gè)原始值
如果valueOf()方法不能返回一個(gè)原始值,使用toString()方法。大多情況都會(huì)發(fā)生這種情況
當(dāng)一個(gè)數(shù)組被轉(zhuǎn)換為原始值,JavaScript會(huì)使用join(",")方法,例如[1,5,6]的原始值是"1,5,6"。一個(gè)普通的JavaScript對(duì)象{}的原始值是"[object Object]"
Learning from examples閱讀實(shí)例請參看上面的轉(zhuǎn)換規(guī)則
Example 1: 數(shù)字和字符串var result = 1 + "5"; // "15"
解釋:
1 + "5" (第二個(gè)操作數(shù)是一個(gè)字符串,那么數(shù)字1將會(huì)變成字符串"1")
"1" + "5" (連接字符串)
"15"
第二個(gè)操作數(shù)是一個(gè)字符串,第一個(gè)操作數(shù)把number轉(zhuǎn)換成string類型,然后將它們連接在一起。
Example 2:數(shù)字和數(shù)組var result = [1, 3, 5] + 1; //"1,3,51"
解釋:
[1,3,5] + 1 (數(shù)組[1,3,5]轉(zhuǎn)換為原始值為"1,3,5")
"1,3,5" + 1 (數(shù)字1轉(zhuǎn)換成字符串"1")
"1,3,5" + "1" (連接字符串)
"1,3,51"
第一個(gè)操作數(shù)是數(shù)組,轉(zhuǎn)換為原始值字符串,第二個(gè)操作數(shù)是數(shù)字,轉(zhuǎn)換為字符串,然后兩個(gè)字符串連接在一起。
Example 3:數(shù)字和布爾值var result = 10 + true; //11
解釋:
10 + true (布爾值true將轉(zhuǎn)換為數(shù)字1)
10 + 1 (數(shù)字做加法運(yùn)算)
11
因?yàn)閮蓚€(gè)操作數(shù)都不是字符串,布爾值將轉(zhuǎn)換為數(shù)字符,然后作數(shù)字加法運(yùn)算。
Example 4: 數(shù)字和對(duì)象var result = 15 + {}; // "15[object Object]"
解釋:
15 + {} (第二個(gè)操作數(shù)是一個(gè)對(duì)象,對(duì)象轉(zhuǎn)換為字符串"[object Object]")
15 + "[object Object]" (數(shù)字15轉(zhuǎn)換為字符串"15")
"15" + "[object Object]" (連接字符串)
"15[object Object]"
第二個(gè)操作數(shù)是一個(gè)對(duì)象,轉(zhuǎn)換為原始值字符串。因?yàn)?b>valueOf()方法返回的是對(duì)象本身,而不是一個(gè)原始值,所以再使用toString()方法,返回一個(gè)字符串。
第二個(gè)操作數(shù)轉(zhuǎn)換之后是一個(gè)字符串,故數(shù)字也將轉(zhuǎn)換為一個(gè)字符串,再把字符串連接在一起。
Example 5:數(shù)字和nullvar result = 8 + null; // 8
解釋:
8 + null(因?yàn)椴僮鲾?shù)沒有字符串,null將轉(zhuǎn)換為數(shù)字0)
8 + 0 (兩個(gè)數(shù)字做加法運(yùn)算)
8
如果操作數(shù)不是對(duì)象或字符串時(shí),null會(huì)轉(zhuǎn)換為數(shù)字,然后做數(shù)字加法運(yùn)算。
Example 6:字符串和nullvar result = "queen" + null; // "queennull"
解釋:
"queen" + null (因?yàn)榈谝粋€(gè)操作數(shù)是一個(gè)字符串,null將轉(zhuǎn)換為一個(gè)字符串"null")
"queen" + "null" (連接字符串)
"queennull"
因?yàn)榈谝粋€(gè)操作數(shù)是一個(gè)字符串,所以null將轉(zhuǎn)換為一個(gè)字符串"null",然后兩個(gè)把字符串連接在一起。
Example 7: 數(shù)字和undefinedvar result = 12 + undefined; // NaN
解釋:
12 + undefined (因?yàn)闆]有任何一個(gè)操作數(shù)是字符串,undefined將轉(zhuǎn)換為一個(gè)數(shù)字NaN)
12 + NaN (做數(shù)字加法運(yùn)算)
NaN
因?yàn)闆]有操作數(shù)是對(duì)象或字符串,undefined將轉(zhuǎn)換為NaN。兩個(gè)數(shù)字做加法運(yùn)算,之所以要做加法,是因?yàn)?b>typeof(NaN) == "number",又因?yàn)槿魏我粋€(gè)數(shù)字和NaN做加法運(yùn)算,所以等于NaN。
結(jié)論以避免潛在的問題,不使用加法運(yùn)算符處理對(duì)象,除非你清楚地使用toString()或valueOf()方法。
如在實(shí)例中看到的,開發(fā)中要明確場景的轉(zhuǎn)換規(guī)則,以防JavaScript給你帶來的驚喜哦。
Have a good coding day!
See the examples in JS Bin
英文原文:JavaScript addition operator in details
MORE延伸幾個(gè)表達(dá)式[] + []; //"" [] + {}; //"[object Object]" {} + {}; //NaN firfox下結(jié)果 {} + {}; //"[object Object][object Object]" chrome下結(jié)果 ({} + {}); //"[object Object][object Object]" {} + []; //0
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/92353.html
摘要:一元運(yùn)算符一元運(yùn)算符只能操作一個(gè)值。邏輯非邏輯非參考數(shù)據(jù)判斷邏輯非運(yùn)算符可以用于任何值。無論這個(gè)值是什么數(shù)據(jù)類型,這個(gè)運(yùn)算符都會(huì)返回一個(gè)布爾值。 前端學(xué)習(xí):教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:運(yùn)算符 JavaScript-運(yùn)算符 JavaScript 有一系列操作數(shù)據(jù)值的運(yùn)算符,運(yùn)算符按照特定運(yùn)算規(guī)則對(duì)...
摘要:甚至包括原型鏈上的所有可枚舉的屬性顯然,我們習(xí)慣的數(shù)組遍歷的結(jié)果是只有這樣的結(jié)果的。當(dāng)代碼運(yùn)行到語句時(shí),執(zhí)行上下文的作用域鏈臨時(shí)被改變了。 前端學(xué)習(xí):教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:流程控制 JavaScript-流程控制 JavaScript是單線程的,一個(gè)語句一個(gè)語句的執(zhí)行。語句是執(zhí)行過程中的流...
摘要:茶余飯后,來杯咖啡對(duì)數(shù)組的每個(gè)元素調(diào)用定義的回調(diào)函數(shù)并返回包含結(jié)果的數(shù)組。因此,題目等同于最終返回。但是的次方計(jì)算出的結(jié)果由于精度問題使得失效。,返回,執(zhí)行會(huì)強(qiáng)制將轉(zhuǎn)換為,,最終返回。我們可能理解為,該函數(shù)存儲(chǔ)的是嵌套函數(shù)創(chuàng)建時(shí)變量的值。 前端學(xué)習(xí):教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:30題_解析 Ja...
摘要:創(chuàng)建數(shù)組數(shù)組字面量數(shù)組構(gòu)造函數(shù)參數(shù)為數(shù)組建議使用數(shù)組字面量方式,性能好,代碼少,簡潔,畢竟代碼少。數(shù)組判斷方法用來判斷某個(gè)值是否為。的這是最簡潔最直接的遍歷數(shù)組元素的語法。把數(shù)組轉(zhuǎn)換為本地?cái)?shù)組,并返回結(jié)果。 前端學(xué)習(xí):前端教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:數(shù)組&數(shù)組方法使用詳解 Array對(duì)象 之前一...
摘要:對(duì)象創(chuàng)建字面量方式構(gòu)造函數(shù)方式也可以這樣不過這樣的話,為何不選擇字面量方式字面量方式和方式的寫法是等價(jià)的,返回的結(jié)果是同種類的對(duì)象。構(gòu)造函數(shù)產(chǎn)生實(shí)例時(shí),實(shí)例通過其對(duì)應(yīng)原型對(duì)象的訪問對(duì)應(yīng)的構(gòu)造函數(shù)對(duì)象。 前端學(xué)習(xí):教程&模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試資源匯總 歡迎提issues斧正:對(duì)象&對(duì)象使用 Object對(duì)象 在 JavaScript 中,對(duì)...
閱讀 1890·2021-10-09 09:44
閱讀 2758·2021-09-22 15:38
閱讀 2564·2021-09-09 09:33
閱讀 774·2021-09-07 09:58
閱讀 1892·2021-09-02 15:41
閱讀 2639·2019-08-30 15:55
閱讀 1863·2019-08-30 15:55
閱讀 628·2019-08-30 15:44