一:陣列的解構賦值
es6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構
let [foo, [[bar], baz]] = [1, [[2], 3]];foo //1
bar //
2baz //
3let [ , , third] = ["foo", "bar", "baz"];
third
//"baz"
let [x, , y] = [1, 2, 3];
x //
1y //
3let [head, ...tail] = [1, 2, 3, 4];
head //1
tail //
[2, 3, 4]
let [x, y, ...z] = ['a'];
x //
"a"y //
undefined
z //
這種寫法屬於「模式匹配」,只要等號兩邊的模式相同,左邊的變數就會被賦予對應的值。上面是一些使用巢狀陣列進行解構的例子。如果解構不成功,變數的值就等於undefined
。
不完全解構:
即等號左邊的模式,只匹配一部分的等號右邊的陣列。這種情況下,解構依然可以成功。如果等號的右邊不是陣列,那麼將會報錯。
let [x, y] = [1, 2, 3];x //
1y //
2let [a, [b], d] = [1, [2, 3], 4];
a //
1b //
2d //
4
預設值:
es6 內部使用嚴格相等運算子(===
),判斷乙個位置是否有值。所以,只有當乙個陣列成員嚴格等於undefined
,預設值才會生效。
let [foo = true] =;foo
//true
let [x, y = 'b'] = ['a']; //
x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; //
x='a', y='b'
let [x = 1] =[undefined];
x //
1let [x = 1] = [null
];x
//null
如果乙個陣列成員是null,預設值就不會生效,因為null不嚴格等於undefined。
預設值可以引用解構賦值的其他變數,但該變數必須已經宣告。上面最後乙個表示式之所以會報錯,是因為x用y做預設值時,y還沒有宣告。
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
二:物件的解構賦值
物件的解構與陣列有乙個重要的不同。陣列的元素是按次序排列的,變數的取值由它的位置決定;而物件的屬性沒有次序,變數必須與屬性同名,才能取到正確的值。
let = ;foo
//"aaa"
bar //
"bbb"
let = ;
baz
//undefined 如果解構失敗,變數的值等於
undefined
。
物件的解構賦值的內部機制,是先找到同名屬性,然後再賦給對應的變數。真正被賦值的是後者,而不是前者。
let = ;baz
//"aaa"
foo //
error: foo is not defined
上面**中,foo是匹配的模式,baz才是變數。真正被賦值的是變數baz,而不是模式foo。
預設值:
和陣列結構一樣,預設值生效的條件是,物件的屬性值嚴格等於undefined
。
var ={};x //
3var = ;
x //
1y //
5var ={};
y //
3var = ;
y //
5var ={};
msg
//"something went wrong"
var =;
x //
3var = ;
x //
null
三:字串結的解構賦值
字串也可以解構賦值。這是因為此時,字串被轉換成了乙個類似陣列的物件。類似陣列的物件都有乙個length
屬性,因此還可以對這個屬性解構賦值。
const [a, b, c, d, e] = 'hello';a //
"h"b //
"e"c //
"l"d //
"l"e //
"o"let = 'hello';
len
//5
四:數值和布林值的結構賦值
解構賦值時,如果等號右邊是數值和布林值,則會先轉為物件。解構賦值的規則是,只要等號右邊的值不是物件或陣列,就先將其轉為物件
let = 123;s === number.prototype.tostring //
true
let = true
;s === boolean.prototype.tostring //
true
上面**中,數值和布林值的包裝物件都有tostring屬性,因此變數s都能取到值。
結構賦值的用途:
1.交換變數的值
let x = 1;let y = 2;
[x, y] = [y, x];
2.從函式返回多個值
//返回乙個陣列
function
example()
let [a, b, c] =example();
//返回乙個物件
function
example() ;
}let = example();
3.函式引數的定義
解構賦值可以方便地將一組引數與變數名對應起來。
//引數是一組有次序的值
function
f([x, y, z])
f([1, 2, 3]);
//引數是一組無次序的值
function
f()
f();
4.提取json資料
let jsondata =;let =jsondata;
console.log(id, status, number);
//42, "ok", [867, 5309]
es6變數解構賦值
es6允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構。解構賦值在實際開發中可以大量減少我們的 量,並且讓我們的程式結構更清晰。陣列的解構賦值 let a,b 1 2 console.log a 1 console.log b 2 上面的 表示,可以從陣列中提取值,按照位置的物件...
ES6變數解構賦值
es6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構 es6之前我們申明多個變數需要按照下面的方法 let l a 1 let b 2 let c 3 let d 4 或者 let a 1,b 2,c 3,d 4 現在我們可以更加簡便 let a,b,c,d 1,2,3,4 ...
es6 變數解構賦值
1.陣列的解構賦值 等號兩邊的模式相同,左邊的變數就會被賦予對應的值 預設值 undefined型別只有乙個值,即undefined。當宣告的變數還未被初始化時,變數的預設值為undefined。null型別也只有乙個值,即null。null用來表示尚未存在的物件,常用來表示函式企圖返回乙個不存在的...