第1個案例:
let a = 1
let b = 2
[a, b] = [b, a]
console.log(a)
console.log(b)
// 會報錯,b is not defined
複製程式碼
因為第2行語句後,少了分號,就會被解析為:
let b = 2[a, b] = [b, a];
複製程式碼
又因為賦值語句的解析,是從右往左,此時b
還沒有被定義,就報錯了。
第2個案例:
let a = 1
let b = 2
let c = 3
[a, b] = [b, a]
console.log(a) // 1
console.log(b) // 2
console.log(c) // [2, 1]
複製程式碼
基於第一個例子,因為第2行語句後沒有分號,所以,會被解析為:
let c = 3[a, b] = [b, a]
複製程式碼
關鍵點就在這個3[a, b]
。
2.1,數值的屬性
屬性訪問器,提供了兩種方式,用於訪問一個物件的屬性,它們分別是點號和方括號:
object.property
object["property"]
複製程式碼
而當訪問一個數值,或者一個數值型別的變數,它的屬性時,
首先會對這個數值或變數進行包裝:
let a = 66
a.toString()
複製程式碼
其實是:
let a = 66
Number(a).toString()
複製程式碼
所以,當組包後,才能使用原本就有的屬性或方法,
但是,即便當組包後,也無法為一個數值型別的變數新增屬性:
let a = 66
a.name = 'number'
console.log(a.name) //undefined
複製程式碼
重點是:雖然無法為數值型別的變數新增屬性,但是這個操作並不會報錯,只是一個無效操作而已。
2.2,逗號運算子
對它的每個運算元求值(從左到右),並返回最後一個運算元的值。 MDN 給的例子
var x = 1;
x = (x++, x);
console.log(x); // 2
x = (2, 3);
console.log(x); // 3
複製程式碼
MDN上給的只有( )
的例子,但其實[ ]
也是一個道理:
let human = {name: 'peiqi', sex: 'girl'}
console.log(human['name', 'sex']) // girl
複製程式碼
2.3 結果
let c = 3[a, b] = [b, a]
複製程式碼
所以,上面程式碼中的 3[a, b]
== 3[b]
== 一個無效操作。
並沒有發生所謂的解構賦值!只是:
let c = [b, a]
複製程式碼
所以,c = [2, 1]