2017-05-29 30 views
0

當對象文字調用toString(){}.toString()這樣的方法將導致語法錯誤,但是當數組文字調用toString()它是確定的。而當我將對象文字賦值給一個變量時,那麼當它調用toString()方法時就OK了。爲什麼?例如:爲什麼不能像{} .toString()這樣的對象直接調用toString()方法導致錯誤?

var o = {}; 
o.toString(); // OK 

{}.toString(); 
// > Uncaught SyntaxError: Unexpected token . 
[1, 2, 3].toString(); // OK 

謝謝!

回答

8

這是因爲{}被視爲第一個有效的塊,而不是在該上下文中的文字。

簡而言之 - 考慮從左到右解釋該行,遇到{,因此預計塊已經啓動。當該塊結束時,它遇到.,並且該標識符不允許在那裏。

如果您要使用({}).toString()那將起作用。

這是因爲該行以(開頭,因此需要一個表達式,它將{}正確標識爲表達式,該表達式被評估爲空對象,因此允許使用'.toString()'。

如果在另一上下文中使用{},在你的示例o = {}中,這被正確解釋爲一個空對象,因爲is在作業的右側(在=之後)。

請注意,在ES6中有一個類似但更常見/實際的情況,在這種情況下,理解這一點非常重要 - 當以單線箭頭函數返回對象時,例如

[1,2,3,4].map(val => { v: val, isOdd: v % 2 === 1 }) // ERROR 
[1,2,3,4].map(val => ({ v: val, isOdd: v % 2 === 1 })) // OK 
+0

好答案!你能否詳細解釋它,爲什麼會發生這種情況?謝謝。 – zhenguoli

+2

[分組](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Grouping)具有較高的[優先級](https://developer.mozilla.org/en/ docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table)而不是[成員訪問](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors#Dot_notation)。 –

相關問題