2016-01-02 101 views
0

任何人都可以解釋一下,當我使用數值添加一個類型爲object的變量時會發生什麼?用對象添加一個數值

我的確在Chrome瀏覽器開發控制檯執行以下操作:

> //Denotes input in dev console 
< //Denotes output 


> var a={}; 
< undefined 
> a 
> Object {} 
> a=a+1; 
< "[object Object]1" 
> a 
< "[object Object]1" 
> b=2 
< 2 
> a+b 
< "[object Object]12" 

還要注意,支架內第一個是小寫Ø bject和第二點是大寫Ø bject。 謝謝。

+0

我不知道某人低估了這個問題的原因。 – roxid

回答

1

規則JavaScript和混合型操作是相當令人費解,並依賴於操作,例如用於+極其簡化說明是:

  • 如果號碼然後算術和執行
  • 兩者都是
  • 如果任何兩個是不是一個號碼,然後都被轉換成字符串並進行

對象的字符串轉換(除非你確定要做什麼)只是"[object Object]"和解釋結果拼接你在問題中描述。

請注意,這不是全部的事實...事情要複雜得多,完整的描述需要諸如.toValue成員的概​​念,Date對象等特殊情況。而且隨着時間的推移,事情變得越來越複雜(例如,ES6行爲需要引入諸如「exoticToPrim」和「OrdinaryToPrimitive」之間區別的概念)。

不幸的是我是不是開玩笑。

如果您在編寫測試程序時想要更好地理解,請不要相信==運算符來檢查結果是什麼,因爲該相等運算符的規則更加複雜(實際上與完全的瘋狂接近)。 Javascript中的==只是一個隱藏的隱藏區,在任何代碼中都應該沒有任何地方(如果奇怪的是,您確實需要它的功能,然後明確實現該行爲並評論爲什麼需要它而不是僅使用==)。

總是使用===

1

這叫做type coercion。技術上無法添加變量a。因此,強制轉換爲字符串,然後獲得與數字1

var a = {} + 1; //[object object]1 
//--> string form of {} will be [object object] 
//--> + operator will use its overload concatenation when it is used over a string. 
//--> The type of value returned after this operation will be a string. 
1
a = a+1 
  1. 它首先如果a是一個數值或不是,如果是,則行爲是正常的數學運算連接起來。
  2. 否則它typecasta在一個字符串中,並繼續正常string concatenation。從對象到字符串的默認轉換爲[object Object],所以a+1[object Object]1

嘗試做stringify({});,它打印[object Object]

1

當您使用加法運算對象使用toString方法轉換爲字符串。然後將字符串a和b連接起來

1

您一定會喜歡這個:https://youtu.be/20BySC_6HyY?t=1m26s這完全是關於嘗試更正變量類型的JavaScript。它有一些瘋狂的邊緣情況。例如

「+」是「添加」2個字符串以形成新的字符串或添加2個數字以產生「總和」。什麼是你的情況 - 你正在嘗試將變量類型更改爲字符串或數字,並創建新的字符串或數字。 JS決定讓新的字符串:

var a = {} 
// Output: Object {} 
a.toString(); 
// Output: "[object Object]" 

要了解我強烈推薦這個:

http://jibbering.com/faq/notes/type-conversion/

+1

感謝您的鏈接。我非常感謝。 – roxid

相關問題