亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

解析JavaScript的ES6版本中的解構賦值

2019-11-20 11:58:39
字體:
來源:轉載
供稿:網友

什么是解構賦值?

解構賦值允許你使用類似數組或對象字面量的語法將數組和對象的屬性值賦給一系列變量。這個語法非常簡潔,而且比傳統的屬性訪問更加清晰。

在不使用解構賦值的情況下,訪問數組的前三項:

var first = someArray[0];var second = someArray[1];var third = someArray[2]; var first = someArray[0];var second = someArray[1];var third = someArray[2];

使用解構賦值后,相應的代碼變得更簡潔和可讀:

var [first, second, third] = someArray; var [first, second, third] = someArray;

SpiderMonkey(Firefox 的 JavaScript 引擎)已經支持解構賦值的大部分特性,但還不完全。
數組和可迭代對象的解構賦值

上面我們已經看到了數組解構賦值的例子,該語法的一般形式是:

[ variable1, variable2, ..., variableN ] = array; [ variable1, variable2, ..., variableN ] = array;

這將把數組中對應的項依次賦給 variable1 到 variableN,如果同時需要聲明變量,可以在解構表達式前面添加 var,let 或 const 關鍵字。

var [ variable1, variable2, ..., variableN ] = array;let [ variable1, variable2, ..., variableN ] = array;const [ variable1, variable2, ..., variableN ] = array; var [ variable1, variable2, ..., variableN ] = array;let [ variable1, variable2, ..., variableN ] = array;const [ variable1, variable2, ..., variableN ] = array;

事實上,你還可以嵌套任意的深度:

var [foo, [[bar], baz]] = [1, [[2], 3]];console.log(foo);// 1console.log(bar);// 2console.log(baz);// 3 var [foo, [[bar], baz]] = [1, [[2], 3]];console.log(foo);// 1console.log(bar);// 2console.log(baz);// 3

此外,還可以跳過數組中的某些項:

var [,,third] = ["foo", "bar", "baz"];console.log(third);// "baz" var [,,third] = ["foo", "bar", "baz"];console.log(third);// "baz"

你還可以用一個 Rest 表達式來捕獲數組中的剩余項:

var [head, ...tail] = [1, 2, 3, 4];console.log(tail);// [2, 3, 4] var [head, ...tail] = [1, 2, 3, 4];console.log(tail);// [2, 3, 4]

如果數組越界或訪問數組中不存在的項,將得到和通過數組索引訪問一樣的值:undefined。

console.log([][0]);// undefinedvar [missing] = [];console.log(missing);// undefined console.log([][0]);// undefined var [missing] = [];console.log(missing);// undefined

注意,數組解構賦值的方式也同樣適用于可遍歷的對象:

function* fibs() { var a = 0; var b = 1; while (true) {  yield a;  [a, b] = [b, a + b]; }}var [first, second, third, fourth, fifth, sixth] = fibs();console.log(sixth);// 5 function* fibs() { var a = 0; var b = 1; while (true) {  yield a;  [a, b] = [b, a + b]; }} var [first, second, third, fourth, fifth, sixth] = fibs();console.log(sixth);// 5

對象的解構賦值

對象的解構賦值允許你將變量綁定到對象不同的屬性值。指定被綁定的屬性名,后面緊跟要綁定的變量:

var robotA = { name: "Bender" };var robotB = { name: "Flexo" };var { name: nameA } = robotA;var { name: nameB } = robotB;console.log(nameA);// "Bender"console.log(nameB);// "Flexo" var robotA = { name: "Bender" };var robotB = { name: "Flexo" }; var { name: nameA } = robotA;var { name: nameB } = robotB; console.log(nameA);// "Bender"console.log(nameB);// "Flexo"

當綁定的屬性名和接收屬性值的變量名一樣時,還有一個語法糖:

var { foo, bar } = { foo: "lorem", bar: "ipsum" };console.log(foo);// "lorem"console.log(bar);// "ipsum" var { foo, bar } = { foo: "lorem", bar: "ipsum" };console.log(foo);// "lorem"console.log(bar);// "ipsum"

與數組一樣,也可以嵌套:

var complicatedObj = { arrayProp: [  "Zapp",  { second: "Brannigan" } ]};var { arrayProp: [first, { second }] } = complicatedObj;console.log(first);// "Zapp"console.log(second);// "Brannigan" var complicatedObj = { arrayProp: [  "Zapp",  { second: "Brannigan" } ]}; var { arrayProp: [first, { second }] } = complicatedObj; console.log(first);// "Zapp"console.log(second);// "Brannigan"

解構一個不存在的屬性時,將得到 undefined:

var { missing } = {};console.log(missing);// undefined var { missing } = {};console.log(missing);// undefined

使用對象的解構賦值時還有一個潛在的陷阱,在解構賦值時沒有聲明變量(沒有 var、let或 const 關鍵字):

{ blowUp } = { blowUp: 10 };// Syntax error { blowUp } = { blowUp: 10 };// Syntax error

這是因為 JavaScript 語法告訴引擎任何以 { 開始的語句都是語句塊(例如,{console} 就是一個合法的語句塊),解決方法是將整個語句用一對括號包裹:

({ safe } = {});// No errors ({ safe } = {});// No errors

其他情況

當你嘗試解構 null 或 undefined,你將得到類型錯誤:

var {blowUp} = null;// TypeError: null has no properties var {blowUp} = null;// TypeError: null has no properties

不過,你可以對其他基本類型(Boolean、String 和 Number)進行解構,將得到 undefined:

var {wtf} = NaN;console.log(wtf);// undefined var {wtf} = NaN;console.log(wtf);// undefined

結果也許會讓你感到意外,但深究一下,其實原因很簡單。在進行對象解構賦值時,被解構的對象將被強制轉換為 Object,除 null 和 undefined 外,其它類型都可以被強制轉換為對象。進行數組的結構賦值時,要求被解構的對象有一個遍歷器。
默認值

可以為不存在的屬性指定一個默認值:

var [missing = true] = [];console.log(missing);// truevar { message: msg = "Something went wrong" } = {};console.log(msg);// "Something went wrong"var { x = 3 } = {};console.log(x);// 3 var [missing = true] = [];console.log(missing);// true var { message: msg = "Something went wrong" } = {};console.log(msg);// "Something went wrong" var { x = 3 } = {};console.log(x);// 3

實際應用
函數參數

作為開發人員,我們經常把一個包含多個屬性的對象作為函數的參數,來實現更靈活的 API,而不是讓 API 的使用者記住一些特定順序的參數。我們可以使用對象的解構賦值,來避免每次使用參數時的屬性訪問:

function removeBreakpoint({ url, line, column }) { // ...} function removeBreakpoint({ url, line, column }) { // ...}

配置對象

完善上面的例子,我們可以為要被解構的對象屬性提供默認值,這在對那些作為配置參數的對象非常實用,因為許多配置項都有一個合理的默認值。例如,jQuery 的 ajax 方法的第二個參數為一個配置對象,我們可以這樣實現:

jQuery.ajax = function (url, { async = true, beforeSend = noop, cache = true, complete = noop, crossDomain = false, global = true, // ... more config}) { // ... do stuff}; jQuery.ajax = function (url, { async = true, beforeSend = noop, cache = true, complete = noop, crossDomain = false, global = true, // ... more config}) { // ... do stuff};

這避免了類似這樣的重復代碼:var foo = config.foo || theDefaultFoo;。
與迭代器一起使用

當遍歷 Map 對象時,我們可以使用解構賦值來遍歷 [key, value]:

var map = new Map();map.set(window, "the global");map.set(document, "the document");for (var [key, value] of map) { console.log(key + " is " + value);}// "[object Window] is the global"http:// "[object HTMLDocument] is the document" var map = new Map();map.set(window, "the global");map.set(document, "the document"); for (var [key, value] of map) { console.log(key + " is " + value);}// "[object Window] is the global"http:// "[object HTMLDocument] is the document"

只遍歷鍵:

for (var [key] of map) { // ...} for (var [key] of map) { // ...}只遍歷值:for (var [,value] of map) { // ...} for (var [,value] of map) { // ...}

返回多個值

返回一個數組,通過解構賦值提取到返回值:

function returnMultipleValues() { return [1, 2];}var [foo, bar] = returnMultipleValues(); function returnMultipleValues() { return [1, 2];}var [foo, bar] = returnMultipleValues();

或者,返回一個鍵值對的對象:

function returnMultipleValues() { return {  foo: 1,  bar: 2 };}var { foo, bar } = returnMultipleValues(); function returnMultipleValues() { return {  foo: 1,  bar: 2 };}var { foo, bar } = returnMultipleValues();

這兩者都比使用中間變量好:

function returnMultipleValues() { return {  foo: 1,  bar: 2 };}var temp = returnMultipleValues();var foo = temp.foo;var bar = temp.bar; function returnMultipleValues() { return {  foo: 1,  bar: 2 };}var temp = returnMultipleValues();var foo = temp.foo;var bar = temp.bar;

采用延續式:

function returnMultipleValues(k) { k(1, 2);}returnMultipleValues((foo, bar) => ...); function returnMultipleValues(k) { k(1, 2);}returnMultipleValues((foo, bar) => ...);

導入 CommonJS 模塊的指定部分

還沒使用過 ES6 的模塊吧,那至少使用過 CommonJS 吧。當導入一個 CommonJS 模塊 X 時,模塊提供的方法也許多余你實際使用的。使用解構賦值,你可以明確指定你需要使用模塊的哪些部分:

const { SourceMapConsumer, SourceNode } = require("source-map"); const { SourceMapConsumer, SourceNode } = require("source-map");

如果你使用 ES6 的模塊機制,你可以看到 import 聲明時有一個類似的語法。
結論

我們看到,解構賦值在很多場景下都很實用。在 Mozilla,我們已經有很多經驗。Lars Hansen 在 10 年前就向 Opera 引入了解構賦值,Brendan Eich 在稍微晚點也給 Firefox 添加了支持,最早出現在 Firefox 2 中。因此,解構賦值已經滲透到我們每天對 JS 的使用中,悄悄地使我們的代碼更簡短、整潔。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩大陆欧美高清视频区| 欧美激情小视频| 91国偷自产一区二区三区的观看方式| 日韩精品免费综合视频在线播放| 亚洲自拍偷拍色片视频| 国产精品一区二区久久精品| 欧美性生交大片免费| 91欧美精品成人综合在线观看| 欧美在线一级va免费观看| 欧美日韩精品中文字幕| 欧美性生交大片免费| 亚洲精品欧美日韩| 欧美日本亚洲视频| 亚洲性生活视频在线观看| 5278欧美一区二区三区| 亚洲国产97在线精品一区| 国产一区二区在线播放| 欧美精品18videos性欧美| 亚洲国产精品视频在线观看| 国产精品激情av在线播放| 久久综合久久88| 国产91精品最新在线播放| www.日韩系列| 国产精品一区二区久久久久| 欧美日韩亚洲高清| 精品国产91久久久久久老师| 俺去亚洲欧洲欧美日韩| 欧美日韩国产一中文字不卡| 亚洲成人精品久久| 久久天堂电影网| 中文字幕日韩专区| 亚洲精品之草原avav久久| 国产精品18久久久久久麻辣| 欧美在线播放视频| 欧美在线精品免播放器视频| 欧美在线精品免播放器视频| 亚洲人成人99网站| 国产精品久久色| 日韩一区二区三区国产| 亚洲最新av在线| 国产a级全部精品| 久久精品国产一区二区电影| 欧美日韩在线视频一区二区| 国产成人精品网站| 亚洲色图日韩av| 国产精品视频中文字幕91| 一区二区三区国产在线观看| 亚洲欧美激情视频| 色综合色综合久久综合频道88| xxx成人少妇69| 日韩电影免费观看在线| 日韩视频第一页| 国产精品视频精品| 青草成人免费视频| 亚洲免费精彩视频| 欧美日韩国产成人高清视频| 国产精品99久久久久久久久| 久久黄色av网站| 欧美电影免费观看高清完整| 亚洲国产精品大全| 国产成人97精品免费看片| 欧美大肥婆大肥bbbbb| 亚洲成年人在线播放| 国产精品成人国产乱一区| 亚洲一级黄色av| 国产精品精品国产| 久久福利网址导航| 国产91精品视频在线观看| 亚洲精品suv精品一区二区| 国产精品无码专区在线观看| 欧美精品videossex88| 亚洲视频在线观看| 亚洲最新视频在线| 久久久精品2019中文字幕神马| 亚洲视频欧洲视频| 成人免费网站在线| 国产精品美女呻吟| 亚洲第一页在线| 欧美交受高潮1| 亚洲第一av在线| 91精品国产网站| 日韩视频在线一区| 国产这里只有精品| 亚洲一级片在线看| 欧美日本精品在线| 亚洲一区美女视频在线观看免费| 亚洲另类激情图| 91精品国产自产在线老师啪| 久久久精品久久| 亚洲综合精品一区二区| 久久久999精品| 国产婷婷成人久久av免费高清| 亚洲男人天堂2024| 亚洲日韩第一页| 98精品国产自产在线观看| 欧美在线国产精品| 日韩人在线观看| 日韩精品中文字幕在线| 欧美午夜片欧美片在线观看| 国产精品一区二区三区久久| 日韩精品在线视频观看| 欧美国产精品日韩| 国产精国产精品| 亚洲深夜福利在线| 亚洲人成绝费网站色www| 亚洲精品一区二区三区婷婷月| 日韩av大片免费看| 国产成人avxxxxx在线看| 久久天天躁狠狠躁夜夜躁| 成人网址在线观看| 欧美裸体xxxxx| 日本精品久久久久久久| 国产日韩av在线| 欧美日韩免费在线观看| 亚洲欧美国产精品久久久久久久| 性色av香蕉一区二区| 91色在线视频| 亚洲乱码国产乱码精品精| 成人福利网站在线观看11| 亚洲人成在线观看| 国产日韩在线看片| 大量国产精品视频| 91人人爽人人爽人人精88v| 日韩专区在线观看| 欧美性生交大片免费| 国产精品永久免费| 亚洲美女av黄| 中文字幕欧美视频在线| 国产精品h片在线播放| 米奇精品一区二区三区在线观看| 久久亚洲国产精品成人av秋霞| 日本不卡视频在线播放| 中文字幕国产亚洲2019| 2019中文字幕免费视频| xxxx欧美18另类的高清| 在线丨暗呦小u女国产精品| 91亚洲永久免费精品| 国产视频一区在线| 亚洲老板91色精品久久| 69av在线播放| 国外成人免费在线播放| 国产精品99蜜臀久久不卡二区| 欧美性猛交xxxx黑人猛交| 91热福利电影| 久久免费国产精品1| 久久久视频在线| 伦伦影院午夜日韩欧美限制| 日本高清+成人网在线观看| 久久久国产视频91| 91在线高清免费观看| 韩国精品美女www爽爽爽视频| 欧洲成人性视频| 一区三区二区视频| 国产视频精品久久久| www.精品av.com| 国产欧美中文字幕| 国产精品激情av在线播放| 欧美亚洲一级片| 日韩在线观看免费高清完整版| 九九热99久久久国产盗摄| 欧美日韩国产999| 久久久久这里只有精品| 97成人精品视频在线观看| 成人久久18免费网站图片|