變數的解構賦值

2021-09-28 14:45:51 字數 3419 閱讀 1593

什麼是解構:es6允許按照一定的模式,從陣列或者物件中提取值,然後賦值給相應變數,此為解構。

解構分為完全解構和不完全解構,前者要求一一對應,後者可以是等號左邊只匹配等號右邊的一部分。解構不成功會返回undefined。

let

[foo]=[

];alert

(foo)

;// undefined

重點:不是只有陣列才可以解構賦值,只要某種資料結構具有 iterator 介面,都可以採用陣列形式的解構賦值。

function

*fibs()

}let

[first, second, third, fourth, fifth, sixth]

=fibs()

;sixth // 5

fibs是乙個generator函式(生成器)

預設值

上面**中,如果乙個陣列成員是null,預設值就不會生效,因為null不嚴格等於undefined。

let

[x =1]

=[undefined]

;x // 1

let[x =1]

=[null];

x // null

預設值還可以是乙個表示式,表示式只有用到的時候才會求值

functionf(

)let

[x =f(

)]=[

1];

預設值可以引用解構賦值的其他變數,但該變數必須已經宣告。

let

[x =

1, y = x]=[

];// x=1; y=1

let[x =

1, y = x]=[

2];// x=2; y=2

let[x =

1, y = x]=[

1,2]

;// x=1; y=2

let[x = y, y =1]

=;// referenceerror: y is not defined

物件的解構賦值和陣列的不同之處在於物件是根據key-value查詢key值來賦值的,和順序沒關係。如果解構失敗返回undefined。

// 例一

let= math;

// 例二

const

= console;

log(

'hello'

)// hello

上面**的例一將math物件的對數、正弦、余弦三個方法,賦值到對應的變數上,使用起來就會方便很多。例二將console.log賦值到log變數。

let obj =

;let

= obj;

alert

(f+l)

;//helloworld

let=

;alert

(baz)

;// aaa

物件的解構賦值的內部機制,是先找到同名屬性,然後再賦給對應的變數。真正被賦值的是後者,而不是前者。前者是模式,後者才是變數

設定繼承關係,obj1繼承自obj2

const obj1 =

;const obj2 =

;object.

setprototypeof

(obj1,obj2)

;const

= obj1;

alert

(foo)

;

字串的解構賦值會被轉換成乙個類似陣列的物件。其有乙個length屬性。

const

[a,b,c,d,e]

='hello'

;alert

(a);

let=

'hello'

;alert

(len)

;

解構賦值的規則是,只要等號右邊的值不是物件或陣列,就先將其轉為物件。

let

=123

;s === number.prototype.tostring // true

let=

true

;s === boolean.prototype.tostring // true

函式的引數可以使用陣列,也可以是物件。引數可以使用預設值。

陣列:

function

add(

[x, y]

)add([

1,2]

);// 3

物件:

為變數指定預設值

function

move(=

)move()

;// [3, 8]

move()

;// [3, 0]

move()

;// [0, 0]

move()

;// [0, 0]

為引數指定預設值

function

move(=

)move()

;// [3, 8]

move()

;// [3, undefined]

move()

;// [undefined, undefined]

move()

;// [0, 0]

可以使用圓括號的情況只有一種:賦值語句的非模式部分,可以使用圓括號。

[

(b)]=[

3];// 正確(=

);// 正確

[(parseint.prop)]=

[3];

// 正確

上面三行語句都可以正確執行,因為首先它們都是賦值語句,而不是宣告語句;其次它們的圓括號都不屬於模式的一部分。第一行語句中,模式是取陣列的第乙個成員,跟圓括號無關;第二行語句中,模式是p,而不是d;第三行語句與第一行語句的性質一致。

主要是針對陣列,物件的解構賦值進行應用,比如:

1.交換變數的值

2.從函式返回多個值

3.向函式傳參

4.提取json資料

5.函式引數的預設值

6.遍歷map解構

7.輸入模組的指定方法

const

=require

("source-map"

);

變數解構賦值

1.從陣列物件中提取值,對變數進行賦值,被稱為結構。2.false,1,nan undefind null轉化為物件後不具備iterator介面,本身不具備iterator介面。3.set結構也可使用陣列的解構賦值,只需要資料機構具備iterator 迭代器 介面,都可以採用陣列形式的解構賦值 ar...

變數的解構賦值

從陣列和物件中提取值,對變數進行賦值,這被稱為解構 本質上,這種寫法屬於 模式匹配 只要等號兩邊的模式相同,左邊的變數就會被賦予對應的值 例子 let a,b,c 1,2,3 let foo,bar baz 1,2 3 foo 1 bar 2 baz 3 let third foo bar baz ...

變數的解構賦值

1 變數的解構賦值 let a,b,c 1,2,3 上面 表示,可以從陣列中提取值,按照對應位置,對變數賦值。注意 es6 內部使用嚴格相等運算子 判斷乙個位置是否有值。所以,只有當乙個陣列成員嚴格等於undefined,預設值才會生效。2 物件的解構賦值 解構不僅可以用於陣列,還可以用於物件。le...