第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為啥{}.toString()會報錯

為啥{}.toString()會報錯

慕斯王 2019-03-13 17:13:03
{}.toString()//會報錯({}).toString()//不報錯[].toString()//不報錯var a= {}; a.toString()//不報錯求解?大家回答都是對的,感謝!
查看完整描述

4 回答

?
LEATH

TA貢獻1936條經驗 獲得超7個贊

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


當做語句塊的開始

當做對象字面量表達式的開始

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


{}.toString()

會報錯:Unexpected token .


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


{}//空語句塊

.toString()//另外一條錯誤的語句

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


({}).toString()

就不會報錯;


[].toString()

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


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

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


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

https://img1.sycdn.imooc.com//5c8f49e00001df1308000231.jpg

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

查看完整回答
2 反對 回復 2019-03-18
?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

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


查看完整回答
反對 回復 2019-03-18
?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

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

查看完整回答
反對 回復 2019-03-18
?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

因為{}被解析為代碼語句了,所以跟{}不構成關系,而.toString()不是完整的一行代碼語句了。

括號里不能包含語句,所以被解釋成表達式。

只要能讓{}不產生歧義地認為是表達式,就不會報錯了,例如:


({}).toString();

({}.toString());

1 * {}.toString();

+{}.toString();

~{}.toString();

-{}.toString();

1 / {}.toString();

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


function(){}(); // function(){}被解析為語句,()內不能為空,所以報錯

(function() {})(); // 通常寫法,可讀性好。后面兩行寫法不推薦

(function() {}());

+function() {}();

new function() {}();


查看完整回答
反對 回復 2019-03-18
  • 4 回答
  • 0 關注
  • 2034 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號