由分號引發的問題

第1個案例:

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

第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行語句後沒有分號,因此,會被解析爲:code

let c = 3[a, b] = [b, a]
複製代碼

關鍵點就在這個3[a, b]對象

2.1,數值的屬性

屬性訪問器,提供了兩種方式,用於訪問一個對象的屬性,它們分別是點號和方括號: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
複製代碼

重點是:雖然沒法爲數值類型的變量添加屬性,可是這個操做並不會報錯,只是一個無效操做而已

2.2,逗號運算符

MDN上的解釋

對它的每一個操做數求值(從左到右),並返回最後一個操做數的值。 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]

相關文章
相關標籤/搜索