let a = 1
let b = 2
[a, b] = [b, a]
console.log(a)
console.log(b)
// 會報錯,b is not defined
複製代碼
由於第2行語句後,少了分號,就會被解析爲:ui
let b = 2[a, b] = [b, a];
複製代碼
又由於賦值語句的解析,是從右往左,此時b
尚未被定義,就報錯了。spa
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行語句後沒有分號,因此,會被解析爲:code
let c = 3[a, b] = [b, a]
複製代碼
關鍵點就在這個3[a, b]
。對象
屬性訪問器,提供了兩種方式,用於訪問一個對象的屬性,它們分別是點號和方括號:ip
object.property
object["property"]
複製代碼
而當訪問一個數值,或者一個數值類型的變量,它的屬性時,get
首先會對這個數值或變量進行包裝:string
let a = 66
a.toString()
複製代碼
實際上是:console
let a = 66
Number(a).toString()
複製代碼
因此,當組包後,才能使用本來就有的屬性或方法,class
可是,即使當組包後,也沒法爲一個數值類型的變量添加屬性:變量
let a = 66
a.name = 'number'
console.log(a.name) //undefined
複製代碼
重點是:雖然沒法爲數值類型的變量添加屬性,可是這個操做並不會報錯,只是一個無效操做而已。
對它的每一個操做數求值(從左到右),並返回最後一個操做數的值。 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
複製代碼
let c = 3[a, b] = [b, a]
複製代碼
因此,上面代碼中的 3[a, b]
== 3[b]
== 一個無效操做。
並無發生所謂的解構賦值!只是:
let c = [b, a]
複製代碼
因此,c = [2, 1]