ES6(五)解構:更方便的數據訪問1

對象數組的字面量在JS 中是最常用的兩種表示法.

并且感謝流行的 JSON 數據格式。

定義對象與數組,然后從中提取出相關信息。

為了簡化提取信息的任務, ES6 新增了解構( destructuring )。



1.對象解構

2.數組解構



在 ES5 及更早版本中,從對象或數組中獲取信息、并將特定數據存入本地變量:

let options = {

????repeat: true,

????save: false

};

// 從對象中提取數據

let repeat = options.repeat,

????save = options.save;

若數據量增大,此方式就不那末好了。


對象解構


對象解構語法在賦值語句的左側使用了對象字面量:

let node = {

? ? type: "Identifier",

? ? name: "foo"

};? ?

let { type, name } = node;

console.log(type); // Identifier

console.log(name); // foo


?node.type 的值被存儲到 type? 本地變量中,node.name? ?的值則存儲到 name 變量中.

簡寫了屬性,本來應該是這樣的:

let {

? ? tyep: type,

? ? name: name

} = node;


對象解構賦值:

注意使用()圓括號.

參見兩個栗子:

let node = {

? ? type: "Identifier",

? ? name: "foo"

},

type = "Literal",

name = 5;


// 使用解構來分配不同的值

({ type, name } = node);

console.log(type); // Identifier

console.log(name); // foo



let node = {

? ? type: "Identifier",

? ? name: "foo"

},

? ? type = "Literal",

? ? name = 5;


function outputInfo(value) {

? ? console.log(value === node); // true

}

outputInfo({ type, name } = node);

console.log(type); // Identifier

console.log(name); // foo




當你使用解構賦值語句時,如果所指定的本地變量在對象中沒有找到同名屬性,那么該變量 會被賦值為undefined 。

let node = {

? ? type: "Identifier",

? ? name: "foo"

};? ?

let { type, name, value } = node;

console.log(type); // Identifier

console.log(name); // foo

console.log(value); // undefined


你可以選擇性地定義一個默認值,以便在指定屬性不存在時使用該值。

若要這么做,需要在 屬性名后面添加一個等號并指定默認值

let { type, name, value = true } = node;


let { type: localType, name: localName } = node;


let { type: localType, name: localName = "bar" } = node;


主要是結合了對象字面量的語法。


嵌套的對象解構


let node = {

? ? type: "Identifier",

? ? name: "foo",

? ? loc: {

? ? ? ? start: {

? ? ? ? ? ? line: 1,

? ? ? ? ? ? column: 1

? ? ? ? },

? ? ? ? end: {

? ? ? ? ? ? line: 1,

? ? ? ? ? ? column: 4

? ? ? ? }

? ? }

};

let {

? ? loc: {

? ? ? ? start

? ? }

} = node;

console.log(start.line);????// 1

console.log(start.column);??// 1



為本地變量使用不同的名稱:

let {

? ? loc: {

? ? ? ? start: localStart

? ? }

} = node;




數組解構

類似于對象解構,將對象字面量替換成了數組字面量。

注意:?數組解構時,解構作用在數組內部的位置上,而不是作用在對象的具名屬性上。

let colors = [ "red", "green", "blue" ];

let [ firstColor, secondColor ] = colors;

console.log(firstColor); // red

console.log(secondColor); // green


若只想獲取數 組中的第三個元素,那么不必給前兩項提供變量名:

let colors = [ "red", "green", "blue" ];

let [ , , thirdColor ] = colors;

console.log(thirdColor); // blue


數組解構賦值:

(數組不用()圓括號,而對象)


let colors = [ "red", "green", "blue" ],

? ? firstColor = "black",

? ? secondColor = "purple";

[ firstColor, secondColor ] = colors;

console.log(firstColor); // red

console.log(secondColor); // green



數組解構賦值有一個非常獨特的用例,能輕易地互換兩個變量的值。

互換變量值在排序算法 中十分常用,而在ES5 中需要使用第三個變量作為臨時變量.



// 在 ES5 中互換值

let a = 1,

? ? b = 2,

? ? tmp;

tmp = a;

a = b;

b = tmp;

console.log(a);?// 2

console.log(b);?// 1


// 在 ES6 中互換值

let a = 1,

? ? b = 2;

[ a, b ] = [ b, a ];

console.log(a);?// 2

console.log(b);?// 1



默認值?

數組解構賦值同樣允許在數組任意位置指定默認值。

當指定位置的項不存在其值為 undefined ,

那么該默認值就會被使用。

let colors = [ "red" ];

let [? firstColor,? secondColor = "green",? ?thiredColor? ] = colors;

console.log(firstColor); // red

console.log(secondColor); // green

console.log(thiredColor); // undefined



嵌套的解構

let colors = [

? ? "red",

? ? [ "green", "lightgreen" ],

? ? "blue"

];

let [ firstColor, [ secondColor ] ] = colors;

console.log(firstColor); // red

console.log(secondColor); // green




剩余項

類似于剩余參數,

... 語法來將剩余的項目賦值給一個指定的變量

let colors = [ "red", "green", "blue" ];

let [? firstColor,? ?...restColors ] = colors;

console.log(firstColor); // red

console.log(restColors.length); // 2

console.log(restColors[0]);?// "green"

console.log(restColors[1]);?// "blue"


剩余項 另一個作用:



克隆數組在 JS 中是個明顯被遺漏的功能。在 ES5 中開發者往往使用的是一個簡單的 方式,也就是用 concat() 方法來克隆數組,

// 在 ES5 中克隆數組

var colors = [ "red", "green", "blue" ];

var clonedColors = colors.concat();

console.log(clonedColors); // ["red", "green", "blue"]

concat() 方法的本意是合并兩個數組,但不使用任何參數來調用此方法,就會獲得原 數組的一個克隆品

?ES6 中,你可以使用剩余項的語法來達到同樣效果


// 在 ES6 中克隆數組

let colors = [ "red", "green", "blue" ];

let [ ...clonedColors ] = colors;

console.log(clonedColors); // ["red", "green", "blue"]


注:

剩余項必須是數組解構模式中最后的部分,之后不能再有逗號,

否則就是語法錯誤。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。