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