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

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 16:23:55
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了解析JavaScript的ES6版本中的解構賦值,ES6版本為JS帶來了諸多簡化方面的改進,需要的朋友可以參考下

什么是解構賦值?

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

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

 

 
  1. var first = someArray[0]; 
  2. var second = someArray[1]; 
  3. var third = someArray[2]; 
  4.  
  5. var first = someArray[0]; 
  6. var second = someArray[1]; 
  7. var third = someArray[2]; 

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

 

 
  1. var [first, second, third] = someArray; 
  2.  
  3. var [first, second, third] = someArray; 

SpiderMonkey(Firefox 的 JavaScript 引擎)已經支持解構賦值的大部分特性,但還不完全。

數組和可迭代對象的解構賦值

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

 

 
  1. [ variable1, variable2, ..., variableN ] = array; 
  2.  
  3. [ variable1, variable2, ..., variableN ] = array; 

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

 

 
  1. var [ variable1, variable2, ..., variableN ] = array; 
  2. let [ variable1, variable2, ..., variableN ] = array; 
  3. const [ variable1, variable2, ..., variableN ] = array; 
  4.  
  5. var [ variable1, variable2, ..., variableN ] = array; 
  6. let [ variable1, variable2, ..., variableN ] = array; 
  7. const [ variable1, variable2, ..., variableN ] = array; 

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

 

 
  1. var [foo, [[bar], baz]] = [1, [[2], 3]]; 
  2. console.log(foo); 
  3. // 1 
  4. console.log(bar); 
  5. // 2 
  6. console.log(baz); 
  7. // 3 
  8.  
  9. var [foo, [[bar], baz]] = [1, [[2], 3]]; 
  10. console.log(foo); 
  11. // 1 
  12. console.log(bar); 
  13. // 2 
  14. console.log(baz); 
  15. // 3 

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

 

 
  1. var [,,third] = ["foo""bar""baz"]; 
  2. console.log(third); 
  3. // "baz" 
  4.  
  5.  
  6. var [,,third] = ["foo""bar""baz"]; 
  7. console.log(third); 
  8. // "baz" 

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

 

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

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

 

 
  1. console.log([][0]); 
  2. // undefined 
  3.  
  4. var [missing] = []; 
  5. console.log(missing); 
  6. // undefined 
  7.  
  8. console.log([][0]); 
  9. // undefined 
  10.  
  11. var [missing] = []; 
  12. console.log(missing); 
  13. // undefined 

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

 

 
  1. function* fibs() { 
  2. var a = 0; 
  3. var b = 1; 
  4. while (true) { 
  5. yield a; 
  6. [a, b] = [b, a + b]; 
  7.  
  8. var [first, second, third, fourth, fifth, sixth] = fibs(); 
  9. console.log(sixth); 
  10. // 5 
  11.  
  12. function* fibs() { 
  13. var a = 0; 
  14. var b = 1; 
  15. while (true) { 
  16. yield a; 
  17. [a, b] = [b, a + b]; 
  18.  
  19. var [first, second, third, fourth, fifth, sixth] = fibs(); 
  20. console.log(sixth); 
  21. // 5 

對象的解構賦值

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

 

 
  1. var robotA = { name: "Bender" }; 
  2. var robotB = { name: "Flexo" }; 
  3.  
  4. var { name: nameA } = robotA; 
  5. var { name: nameB } = robotB; 
  6.  
  7. console.log(nameA); 
  8. // "Bender" 
  9. console.log(nameB); 
  10. // "Flexo" 
  11.  
  12. var robotA = { name: "Bender" }; 
  13. var robotB = { name: "Flexo" }; 
  14.  
  15. var { name: nameA } = robotA; 
  16. var { name: nameB } = robotB; 
  17.  
  18. console.log(nameA); 
  19. // "Bender" 
  20. console.log(nameB); 
  21. // "Flexo" 

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

 

 
  1. var { foo, bar } = { foo: "lorem", bar: "ipsum" }; 
  2. console.log(foo); 
  3. // "lorem" 
  4. console.log(bar); 
  5. // "ipsum" 
  6.  
  7. var { foo, bar } = { foo: "lorem", bar: "ipsum" }; 
  8. console.log(foo); 
  9. // "lorem" 
  10. console.log(bar); 
  11. // "ipsum" 

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

 

 
  1. var complicatedObj = { 
  2. arrayProp: [ 
  3. "Zapp"
  4. { second: "Brannigan" } 
  5. }; 
  6.  
  7. var { arrayProp: [first, { second }] } = complicatedObj; 
  8.  
  9. console.log(first); 
  10. // "Zapp" 
  11. console.log(second); 
  12. // "Brannigan" 
  13.  
  14. var complicatedObj = { 
  15. arrayProp: [ 
  16. "Zapp"
  17. { second: "Brannigan" } 
  18. }; 
  19.  
  20. var { arrayProp: [first, { second }] } = complicatedObj; 
  21.  
  22. console.log(first); 
  23. // "Zapp" 
  24. console.log(second); 
  25. // "Brannigan" 

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

 

 
  1. var { missing } = {}; 
  2. console.log(missing); 
  3. // undefined 
  4.  
  5. var { missing } = {}; 
  6. console.log(missing); 
  7. // undefined 

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

 

 
  1. { blowUp } = { blowUp: 10 }; 
  2. // Syntax error 
  3.  
  4. { blowUp } = { blowUp: 10 }; 
  5. // Syntax error 

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

 

 
  1. ({ safe } = {}); 
  2. // No errors 
  3.  
  4. ({ safe } = {}); 
  5. // No errors 

其他情況

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

 

 
  1. var {blowUp} = null
  2. // TypeError: null has no properties 
  3.  
  4. var {blowUp} = null
  5. // TypeError: null has no properties 

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

 

 
  1. var {wtf} = NaN; 
  2. console.log(wtf); 
  3. // undefined 
  4.  
  5.  
  6. var {wtf} = NaN; 
  7. console.log(wtf); 
  8. // undefined 

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

默認值

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

 

 
  1. var [missing = true] = []; 
  2. console.log(missing); 
  3. // true 
  4.  
  5. var { message: msg = "Something went wrong" } = {}; 
  6. console.log(msg); 
  7. // "Something went wrong" 
  8.  
  9. var { x = 3 } = {}; 
  10. console.log(x); 
  11. // 3 
  12.  
  13. var [missing = true] = []; 
  14. console.log(missing); 
  15. // true 
  16.  
  17. var { message: msg = "Something went wrong" } = {}; 
  18. console.log(msg); 
  19. // "Something went wrong" 
  20.  
  21. var { x = 3 } = {}; 
  22. console.log(x); 
  23. // 3 

實際應用 函數參數

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

 

 
  1. function removeBreakpoint({ url, line, column }) { 
  2. // ... 
  3.  
  4. function removeBreakpoint({ url, line, column }) { 
  5. // ... 

配置對象

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

 

 
  1. jQuery.ajax = function (url, { 
  2. async = true
  3. beforeSend = noop, 
  4. cache = true
  5. complete = noop, 
  6. crossDomain = false
  7. global = true
  8. // ... more config 
  9. }) { 
  10. // ... do stuff 
  11. }; 
  12.  
  13. jQuery.ajax = function (url, { 
  14. async = true
  15. beforeSend = noop, 
  16. cache = true
  17. complete = noop, 
  18. crossDomain = false
  19. global = true
  20. // ... more config 
  21. }) { 
  22. // ... do stuff 
  23. }; 

這避免了類似這樣的重復代碼:var foo = config.foo || theDefaultFoo;。

與迭代器一起使用

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

 

 
  1. var map = new Map(); 
  2. map.set(window, "the global"); 
  3. map.set(document, "the document"); 
  4.  
  5. for (var [key, value] of map) { 
  6. console.log(key + " is " + value); 
  7. // "[object Window] is the global" 
  8. // "[object HTMLDocument] is the document" 
  9.  
  10.  
  11. var map = new Map(); 
  12. map.set(window, "the global"); 
  13. map.set(document, "the document"); 
  14.  
  15. for (var [key, value] of map) { 
  16. console.log(key + " is " + value); 
  17. // "[object Window] is the global" 
  18. // "[object HTMLDocument] is the document" 

只遍歷鍵:

 

 
  1. for (var [key] of map) { 
  2. // ... 
  3.  
  4.  
  5. for (var [key] of map) { 
  6. // ... 
  7.  
  8. 只遍歷值: 
  9. for (var [,value] of map) { 
  10. // ... 
  11.  
  12.  
  13. for (var [,value] of map) { 
  14. // ... 

返回多個值

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

 

 
  1. function returnMultipleValues() { 
  2. return [1, 2]; 
  3. var [foo, bar] = returnMultipleValues(); 
  4.  
  5.  
  6. function returnMultipleValues() { 
  7. return [1, 2]; 
  8. var [foo, bar] = returnMultipleValues(); 

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

 

 
  1. function returnMultipleValues() { 
  2. return { 
  3. foo: 1, 
  4. bar: 2 
  5. }; 
  6. var { foo, bar } = returnMultipleValues(); 
  7.  
  8.  
  9. function returnMultipleValues() { 
  10. return { 
  11. foo: 1, 
  12. bar: 2 
  13. }; 
  14. var { foo, bar } = returnMultipleValues(); 

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

 

 
  1. function returnMultipleValues() { 
  2. return { 
  3. foo: 1, 
  4. bar: 2 
  5. }; 
  6. var temp = returnMultipleValues(); 
  7. var foo = temp.foo; 
  8. var bar = temp.bar; 
  9.  
  10. function returnMultipleValues() { 
  11. return { 
  12. foo: 1, 
  13. bar: 2 
  14. }; 
  15. var temp = returnMultipleValues(); 
  16. var foo = temp.foo; 
  17. var bar = temp.bar; 

采用延續式:

 

 
  1. function returnMultipleValues(k) { 
  2. k(1, 2); 
  3. returnMultipleValues((foo, bar) => ...); 
  4.  
  5.  
  6. function returnMultipleValues(k) { 
  7. k(1, 2); 
  8. returnMultipleValues((foo, bar) => ...); 

導入 CommonJS 模塊的指定部分

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

 

 
  1. const { SourceMapConsumer, SourceNode } = require("source-map"); 
  2.  
  3. 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
午夜精品99久久免费| 亚洲美女视频网站| 欧美小视频在线观看| 国产在线观看精品一区二区三区| 成人亲热视频网站| 午夜精品一区二区三区在线播放| 91国内在线视频| 上原亚衣av一区二区三区| 欧美日韩中文字幕综合视频| 欧美国产在线视频| 国产成人综合av| 97在线视频免费看| 欧美性猛xxx| 亚洲xxxxx性| 韩国精品久久久999| 久久久久久国产免费| 亚洲国内精品在线| 97视频com| 成人做爽爽免费视频| 国产精品久久久久久久av大片| 欧美视频13p| 日韩国产欧美区| 色妞欧美日韩在线| 亚洲精品少妇网址| 2019国产精品自在线拍国产不卡| 亚洲国产福利在线| 亚洲精品美女网站| 欧美性受xxxx黑人猛交| 久久国产一区二区三区| 一级做a爰片久久毛片美女图片| 国产主播精品在线| 国产精品旅馆在线| 亚洲一区二区精品| 欧美福利视频在线观看| 亚洲欧美日韩一区在线| 久久视频在线免费观看| 久久99国产综合精品女同| 亚洲在线一区二区| 久久综合网hezyo| 伊是香蕉大人久久| 欲色天天网综合久久| 亚洲aaa激情| 欧美肥老太性生活视频| 午夜精品久久久久久99热软件| 成人国产精品久久久| 久久久久久亚洲精品中文字幕| 成人免费网站在线观看| 欧美成人精品不卡视频在线观看| 国产香蕉97碰碰久久人人| 日韩欧美在线观看视频| 国产成人精品日本亚洲| 91亚洲精品视频| 国产午夜精品一区二区三区| 国产成人精品一区| 欧美午夜宅男影院在线观看| 亚洲一区二区中文字幕| 国内精品久久久久久久久| 国产精品久久久久久超碰| 国产精品女人久久久久久| 国产精品免费一区豆花| 91精品国产免费久久久久久| 久久久精品久久久| 91麻豆国产精品| 91精品国产高清自在线看超| 国产一区二区日韩| 大胆欧美人体视频| 国产999在线观看| 一区二区三区精品99久久| 国产日韩av在线| 久久久黄色av| 久久精品国产综合| 日韩在线精品视频| 亚洲免费成人av电影| 欧美电影院免费观看| 精品亚洲一区二区三区在线观看| 中文字幕日韩在线播放| 亚洲综合国产精品| 欧美成在线观看| 久久99精品久久久久久青青91| 欧美日韩中文字幕在线| 欧美激情手机在线视频| 日韩av快播网址| 在线成人激情黄色| 久久久成人精品| 亚洲精品乱码久久久久久金桔影视| 国产精品久久激情| 精品人伦一区二区三区蜜桃免费| 久久精品视频播放| 久久69精品久久久久久国产越南| 欧美亚洲在线播放| 亚洲va欧美va国产综合剧情| 久久免费观看视频| 亚洲欧美国产一本综合首页| 亚洲最新在线视频| 日韩精品免费在线观看| 日韩一区二区av| 精品成人乱色一区二区| 国产精品欧美亚洲777777| 在线看欧美日韩| 成人精品一区二区三区| 亚洲视频在线免费观看| 秋霞av国产精品一区| 91黑丝高跟在线| 亚洲精品自产拍| 91国产美女视频| 最近2019中文字幕大全第二页| 亚洲精品免费一区二区三区| 国产精品无码专区在线观看| 亚洲最大av网| 4444欧美成人kkkk| 欧美日韩裸体免费视频| 欧美大秀在线观看| 久99久在线视频| 性视频1819p久久| 亲子乱一区二区三区电影| 在线视频一区二区| 欧美性xxxx极品高清hd直播| wwwwwwww亚洲| 91国产中文字幕| 欧美性猛交xxxx偷拍洗澡| 国产欧美在线播放| 97人洗澡人人免费公开视频碰碰碰| 91精品国产精品| 色偷偷888欧美精品久久久| 在线观看国产精品淫| 国产精品久久久久久久久| 亚洲视屏在线播放| 日韩精品久久久久| 欧美成人精品一区二区| 国产精品扒开腿爽爽爽视频| 国产九九精品视频| 亚洲精品成人久久电影| 精品国产区一区二区三区在线观看| 欧美大片免费观看| 91亚洲国产成人久久精品网站| 午夜精品蜜臀一区二区三区免费| 欧美激情videos| 丰满岳妇乱一区二区三区| 亚洲一区二区三区四区在线播放| 亚洲影院高清在线| 亚洲丝袜av一区| 久久免费观看视频| 国产成人久久久精品一区| 国产欧美一区二区三区久久人妖| 日韩中文字幕免费| 国产精品第三页| 中文字幕日韩在线观看| 91高清视频在线免费观看| 亚洲成人精品视频在线观看| 欧美丰满老妇厨房牲生活| 国a精品视频大全| 亚洲国产精久久久久久久| 97久久精品视频| 欧美性xxxx| 欧美做爰性生交视频| 国产精品一区二区三区在线播放| 国产精品视频网址| 亚洲欧洲在线看| 欧美成人三级视频网站| 欧美电影电视剧在线观看| 免费97视频在线精品国自产拍| 久久久久久国产精品久久| 国产一区二区三区四区福利| 91精品视频免费|