鍍金池/ 問答/HTML/ 為啥{}.toString()會報錯

為啥{}.toString()會報錯

{}.toString()//會報錯

({}).toString()//不報錯
[].toString()//不報錯
var a= {}; a.toString()//不報錯

求解?

大家回答都是對的,感謝!

回答
編輯回答
葬憶

js 引擎在執(zhí)行時,遇到 {,至少有兩種選擇,

  1. 當做語句塊的開始
  2. 當做對象字面量表達式的開始

但是,默認情況下,是當做語句塊的,所以

{}.toString()

會報錯:Unexpected token .

因為實際上瀏覽器執(zhí)行的可能是這樣:

{}//空語句塊
.toString()//另外一條錯誤的語句

如果要讓 js 引擎認為 { 是一個對象字面量表達式的開始,一般就是加 (),這個時候,js 引擎就知道()里的是表達式,所以當做表達式來解析,所以

({}).toString()

就不會報錯;

[].toString()

這個不報錯,很正常,因為這里沒有歧義,肯定是數組字面量表達式

var a= {}; a.toString()//不報錯

這個不報錯,更正常了,沒有歧義,分號表示有兩條語句,雖然放在同一行,不影響,因為有分號;

我來給你看看書上是怎么說的:

clipboard.png

不過具體解析的時候,chrome 還有點特殊的,詳情戳這
JavaScript高級程序設計-第3版-中 p84

2018年1月3日 16:23
編輯回答
你好胸

因為{}被解析為代碼語句了,所以跟{}不構成關系,而.toString()不是完整的一行代碼語句了。
括號里不能包含語句,所以被解釋成表達式。
只要能讓{}不產生歧義地認為是表達式,就不會報錯了,例如:

({}).toString();
({}.toString());
1 * {}.toString();
+{}.toString();
~{}.toString();
-{}.toString();
1 / {}.toString();

這也是立即執(zhí)行函數為什么不報錯的原因。

function(){}(); // function(){}被解析為語句,()內不能為空,所以報錯
(function() {})(); // 通常寫法,可讀性好。后面兩行寫法不推薦
(function() {}());
+function() {}();
new function() {}();

2017年2月27日 03:26
編輯回答
扯機薄

因為這里 {} 被解析成了一個空的block, 不是解析成一個對象
這個和[] + {}, {} + [] 結果為什么不一樣是一樣的道理

2017年10月11日 23:18
編輯回答
夢囈

我猜是{}被當成了代碼塊吧,自然就沒有toString的方法了。

2018年3月9日 12:25