在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 為啥{}.toString()會(huì)報(bào)錯(cuò)

為啥{}.toString()會(huì)報(bào)錯(cuò)

{}.toString()//會(huì)報(bào)錯(cuò)

({}).toString()//不報(bào)錯(cuò)
[].toString()//不報(bào)錯(cuò)
var a= {}; a.toString()//不報(bào)錯(cuò)

求解?

大家回答都是對(duì)的,感謝!

回答
編輯回答
葬憶

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

  1. 當(dāng)做語句塊的開始
  2. 當(dāng)做對(duì)象字面量表達(dá)式的開始

但是,默認(rèn)情況下,是當(dāng)做語句塊的,所以

{}.toString()

會(huì)報(bào)錯(cuò):Unexpected token .

因?yàn)閷?shí)際上瀏覽器執(zhí)行的可能是這樣:

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

如果要讓 js 引擎認(rèn)為 { 是一個(gè)對(duì)象字面量表達(dá)式的開始,一般就是加 (),這個(gè)時(shí)候,js 引擎就知道()里的是表達(dá)式,所以當(dāng)做表達(dá)式來解析,所以

({}).toString()

就不會(huì)報(bào)錯(cuò);

[].toString()

這個(gè)不報(bào)錯(cuò),很正常,因?yàn)檫@里沒有歧義,肯定是數(shù)組字面量表達(dá)式

var a= {}; a.toString()//不報(bào)錯(cuò)

這個(gè)不報(bào)錯(cuò),更正常了,沒有歧義,分號(hào)表示有兩條語句,雖然放在同一行,不影響,因?yàn)橛蟹痔?hào);

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

clipboard.png

不過具體解析的時(shí)候,chrome 還有點(diǎn)特殊的,詳情戳這
JavaScript高級(jí)程序設(shè)計(jì)-第3版-中 p84

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

因?yàn)閧}被解析為代碼語句了,所以跟{}不構(gòu)成關(guān)系,而.toString()不是完整的一行代碼語句了。
括號(hào)里不能包含語句,所以被解釋成表達(dá)式。
只要能讓{}不產(chǎn)生歧義地認(rèn)為是表達(dá)式,就不會(huì)報(bào)錯(cuò)了,例如:

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

這也是立即執(zhí)行函數(shù)為什么不報(bào)錯(cuò)的原因。

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

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

因?yàn)檫@里 {} 被解析成了一個(gè)空的block, 不是解析成一個(gè)對(duì)象
這個(gè)和[] + {}, {} + [] 結(jié)果為什么不一樣是一樣的道理

2017年10月11日 23:18
編輯回答
夢(mèng)囈

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

2018年3月9日 12:25