[英]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.