簡體   English   中英

問大家一個問題,這是如何分析的?

[英]Ask everyone a question, how is this analyzed?

 let a = 1 let b = 2 [a, b] = [b, a] console.log(a) console.log(b) 

b = 2 (沒有分號)會出錯:

在此輸入圖像描述

2。

 let a = 1 let b = 2 let c = 3 [a, b] = [b, a] console.log(a) console.log(b) console.log(c) 

c = 3沒有分號,沒有錯誤, c將變成一個數組。 為什么是這樣?

在此輸入圖像描述

自動分號插入有一些怪癖,這就是其中之一。 在你的第一個例子中,在第二行的末尾不會插入分號,因此它會像這樣讀取解析器:

let b = 2[a, b] = [b, a];

這引發了一個異常,因為b尚不存在,但它正試圖用來定義自己。 示例2看起來類似,但現在指的是已經存在的變量,因此您只需要一個非常奇怪的代碼片段而不是異常:

let c = 2[a, b] = [b, a];

至於這意味着什么,首先讓我們看看2[a, b] 數字被裝箱到對象,因此可以訪問它們的屬性。 這就是為什么,例如,您可以執行以下操作:

let temp = 2;
console.log(temp.toString());

temp是一個數字對象,它上面有一個toString屬性。 現在,因為. 字符對數字有特殊含義(它是小數點),你不能使用數字文字,所以像下面這樣的東西是非法的:

2.toString();

但是使用括號語法很好,如:

2['toString']()

這個括號語法就是我們在2[a, b] :它試圖訪問2.屬性? 2 [b],解析為2 [2]。 a與奇怪的逗號運算符一起使用 ,基本上被忽略了。

什么是2 [2]? 沒什么,只是一個undefined的屬性。 如果你試圖分配它,那么就不會發生任何注意事項,因為數字不允許你像這樣修改它們的屬性。 但是如果你願意的話,你仍然可以嘗試分配它,它會默默地失敗(無論如何都是非嚴格的模式)。

總結一下2[a, b] = [b, a]; 確實:它創建一個包含元素[b, a]的數組,然后嘗試將其分配給2 [2]。 這對數字2沒有任何作用,但是您嘗試分配的值確實成為表達式的結果,因此2[a, b] = [b, a]; 只是[b, a] ,這是[2, 1] 反過來,這被分配給c,因為代碼let c = //etc

神奇的是分號 如果沒有行分隔符,編譯器會感到困惑,並且不知道“預期”邏輯是什么。 它將新線視為空白 從而,

let c = 3
[a, b] = [b, a]

變換為單行語句let c = 3[a, b] = [b, a]

現在由於雙重賦值,使用后面的賦值( [b, a] )。
c現在變成一個包含b然后a的數組。

這可以在以下內容中看到:

 let a = 1 let b = 2 let c = 3 [a, b] = [b, a] console.log(c) 

請注意,只需添加分號即可獲得“所需”輸出:

 let a = 1; let b = 2; let c = 3; [a, b] = [b, a]; console.log(c); 

黑曜石時代在他的回答中解釋得很好但案例1沒有解釋。 所以,就是這樣。

情況1:

let a = 1
let b = 2
[a, b] = [b, a]
console.log(a)
console.log(b)

這里沒有分號,編譯器會像這樣理解它。

 let a = 1 let b = 2[a, b] = [b, a] console.log(a) console.log(b) 

因此給出了參考錯誤,因為當你要宣布b時,b尚未被聲明。

當你這樣做時:

let a = 1
let b = 2
[a, b] = [b, a]

你在做:

let a = 1
let b = 2[a,b] = (this is the assignment which you doing '[b,a]', but `b` is not defined yet)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM