2014-09-25 93 views
15

排序的JavaScript中嘗試一些怪癖:爲什麼數字+字符串在JavaScript中的字符串?

首先,我做了

console.log("5" + 1); 

這將打印51,這是正常的權利,無論是數字和字符串有一個+運營商,但由於字符串是第一個變量它會將1轉換爲一個字符串。

現在我這樣做的時候:

console.log(1 + "5") 

我期望輸出爲6,因爲我認爲這將字符串轉換爲數字。 但是,神奇的輸出是15.

任何人都更有經驗的JavaScript照亮了我呢?

+5

加法(甚至不同類型)下面的[交換律](http://www.mathsisfun.com/definitions/commutative-law .html)並不是一件壞事;-) – linqu 2014-09-25 12:00:27

+2

可能的重複:http://stackoverflow.com/questions/5961000/javascript-sign-concatenates-instead-of-giving-sum-of-variables(第一個發現,我敢肯定有很多在那裏) – rlemon 2014-09-25 12:07:25

+2

@linqu期望,它是*不*交換,因爲'「5」+ 1 ==「51」!=「15」== 1 +「5」'。 – Bakuriu 2014-09-25 16:28:51

回答

27

引述的ECMAScript規格The Addition operator (+) section

  1. 如果Type(lprim)是字符串類型(rprim)是字符串,然後
    返回字符串也就是串聯的ToString(lprim),隨後的ToString(rprim)

的結果,所以,爲了此處無關緊要。

+0

打我吧......一般的規則是:如果你添加一個數字和一個字符串,結果將是一個字符串! – Joshpbarron 2014-09-25 11:59:27

+0

是啊,奇怪的規則雖然 – 2014-09-25 12:00:49

+5

爲什麼奇怪?如果有字符串,那麼結果也會是字符串。容易記住。如果結果取決於操作數的順序,我想這會很奇怪。 – dfsq 2014-09-25 12:01:27

2

在這兩種情況下,該值都將被轉換爲字符串。 將數字添加到字符串或字符串中時,結果是一個字符串。

只需使用parseInt(value)toString(value)即可強制轉換。

+0

好的答案,除了沒有引文! – 2014-09-25 15:30:54

-6

串聯還在Javascript中使用+

var result = "String" + number + obj; 
// is equivalent to 
string result = "String" + number.ToString() + obj.ToString(); 

不過的事情是,在C#/。NET,你可以做同樣的事情,你會得到同樣的結果 - System.Console.WriteLine("result is " + 10 + 20);

在JavaScript(和C#)中,字符串是不可變的。他們永遠不能改變,只能用其他字符串替換。您可能知道組合+「String」不會直接修改組合變量 - 該操作會創建一個將兩個字符串連接在一起的結果的新字符串,但是您必須將該新字符串分配給組合變量if你希望它被改變。

關於使用數學運算符進行字符串連接的爭論可以說是一個「不正確的」參數,但也有一個參數可以使用+來執行大量的字符串連接可能會非常緩慢。

+0

「,但還有一個理由是使用+來執行大量的字符串連接可能會非常緩慢。」這不再是真的了。 http://jsperf.com/string-concat-without-sringbuilder/5我從這個鏈接[這個答案](http://stackoverflow.com/a/4717855/829835) – rlemon 2014-09-25 14:38:25

+11

這怎麼回答這個問題? – nhahtdh 2014-09-25 15:18:15

+1

我不明白爲什麼這麼多downvote,只是在他/她的問題上給OP一個簡單的解釋!什麼f * ck! – 2014-09-26 06:08:45

8

的console.log(1 + 「5」) 我期望輸出爲6,因爲我認爲這將字符串轉換爲數字。 ...

但是如果你寫了以下內容,你會期待什麼?

console.log(1 + " fine day") 

console.log(1 + " answer(s) to my question") 

不可能有任何保證,一般來說,一個字符串轉換爲一個數字。但是任何數字都可以轉換爲字符串。這就是爲什麼將轉換規則編寫爲向兼容的類型轉變的原因。 (在作爲程序員的情況下,您可以將字符串安全地轉換爲數字,那麼您可以明確地這樣做,以便+操作在兩個數字之間,但對於字符串而言通常不是這樣。)

在其他情況下,這也是爲什麼小型和低精度浮標在混合類型(後者類型)下操作時會轉換爲大型整數或雙精度浮標。你可以安全地將有限的表格轉換成更大的表格,但是你不能安全地轉向另一個方向。一個小的int可以表示爲一個大的int或者一個double,但是另一個方向通常不是一個安全的轉換。

因此,對混合類型操作的轉換規則儘可能寫入可行的轉換爲安全常見類型的相互兼容類型。編程人員可以爲特殊情況編寫顯式轉換,其中更一般的類型可以安全地轉換爲更有限的類型。

1

可以嘗試代碼:
console.log(1 + parseInt("5")) => 6

相關問題