ES6 -- 解構分配(Destructuring Assignment)
"解構分配"意思是: 可從一個現有的物件或陣列中產生新的變數出來。且用這種方式的語法會變得更簡潔、直觀清楚。
在ES6中用解構分配來做:
在ES5中, 當我們想將原本陣列的值以相反順序放進去並存放在新變數時, 會這麼做:
e.g.
var item = ["a", "z"];
var a = item[0];
var z = item[1];
item = [z, a]; // 在此設定為新的陣列, 且值放的順序是和原本陣列相反的
console.log(item); // ["z", "a"]
在ES6中用解構分配來做:
e.g.
var item = ["a", "z"];
var [a, z] = item; // 重點 --> 在此的 [a, z]會自動對應上一行的"a"和"z"。用"[]"表示是從陣列中去做解構分配, 在此[]只能算是變數的集合, 而非真的是個陣列
item = [z, a]; // 在此設定為新的陣列, 且值放的順序是和原本陣列相反的
console.log(item); // ["z", "a"]
另外, 在ES5中, 當我們將物件的屬性存放在新變數時, 會這麼做:
e.g.
var obj = {
name: "John",
age: 30,
sex: "man"
};
var name = obj.name;
var age = obj.age;
var sex = obj.sex;
console.log(name, age, sex); // John 30 man
在ES6中用解構分配來做:
e.g.
var obj = {
name: "John",
age: 30,
sex: "man"
};
var {name, age, sex} = obj; // 重點 --> 在此的{name, age, sex}會自動對應上面的"name"、"age"、"sex"。用"{}"表示是從物件中去做解構分配, 在此{}只能算是變數的集合, 而非真的是個物件
console.log(name, age, sex); // John 30 man
另外, 如果我們今天想要處理的是"深層物件"(深層物件是指物件中又有物件)呢:
在ES5中是這樣寫:
e.g.
var obj = {
name: {
firstName: "John",
lastName: "Lin"
},
age: 30,
sex: "man"
};
var firstName = obj.name.firstName;
var lastName = obj.name.lastName;
var age = obj.age;
var sex = obj.sex;
console.log(firstName, lastName, age, sex); // John Lin 30 man
在ES6中用解構分配來做:
e.g.
var obj = {
name: {
firstName: "John",
lastName: "Lin"
},
age: 30,
sex: "man"
};
var {name:{firstName, lastName}, age, sex} = obj; // 重點在這句
console.log(firstName, lastName, age, sex); // John Lin 30 man
再者, 如果今天當我們傳入的參數是個陣列, 且需要在函式中將陣列值取出:
在ES5中會這樣做:
e.g.
function f1(ary) {
var name = ary[0]; // 在此取出陣列第1個值
var age = ary[1]; // 在此取出陣列第2個值
console.log(name, age); // John 30
}
f1(["John", 30]);
在ES6中用解構分配來做:
e.g.
function f2([name, age]) { // 直接在傳入參數這邊做解構分配
console.log(name, age); // John 30
}
f2(["John", 30]);
再者, 如果今天當我們傳入的參數是個物件, 且需要在函式中將物件的屬性值取出:
在ES5中會這樣做:
e.g.
function f1(obj) {
var name = obj.name; // 在此取出物件物件屬性值
var age = obj.age; // 在此取出物件物件屬性值
console.log(name, age); // John 30
}
f1({name: "John", age: 30});
在ES6中用解構分配來做:
e.g.
function f2({name, age}) { // 直接在傳入參數這邊做解構分配
console.log(name, age); // John 30
}
f2({name: "John", age: 30});
最後, 如果我們需要為新變數指定預設值時,要如何做呢:
在ES5中, 會這樣寫:
e.g.
var list = [7, 42];
var a = list[0] ? list[0] : 1;
var b = list[1] ? list[1] : 2;
var c = list[2] ? list[2] : 3; // 取不到值, 所以得到3
var d = list[3] ? list[3] : undefined; // 取不到值, 所以得到undefined
console.log(a, b, c, d); // 7 42 3 undefined
在ES6中用解構分配來做:
e.g.
var list = [7, 42];
var [a = 1, b = 2, c = 3, d] = list; // 重點 --> 在此的 [a = 1, b = 2, c = 3, d]會自動對應上一行的"7"和"42"。用"[]"表示是從陣列中去做解構分配, 在此[]只能算是變數的集合, 而非真的是個陣列。d不給值 --> 通常預設值是"undefined"。(如果d=null, 那會輸出"null")。會用到預設值通常代表陣列值不夠分配。
console.log(a, b, c, d); // 7 42 3 undefined
留言
張貼留言