網站首頁 前端文檔 正文
概念
ES6提供了更簡潔的賦值模式,從數組和對象中提取值,這被稱為解構
示例:
[a, b] = [50, 100]; console.log(a); // expected output: 50 console.log(b); // expected output: 100 [a, b, ...rest] = [10, 20, 30, 40, 50]; console.log(rest); // expected output: [30, 40, 50]
數組解構
數組解構是非常簡單簡潔的,在賦值表達式的左側使用數組字面量,數組字面量中的每個變量名稱映射為解構數組的相同索引項
這是什么意思呢,就是如下面這個示例一樣,左邊數組中的項分別得到了右側解構數組相應索引的值
let [a, b, c] = [1, 2, 3]; // a = 1 // b = 2 // c = 3
聲明分別賦值
你可以通過變量聲明分別解構賦值
示例:聲明變量,分別賦值
// 聲明變量 let a, b; // 然后分別賦值 [a, b] = [1, 2]; console.log(a); // 1 console.log(b); // 2
解構默認值
如果解構取出的值是undefined,可以設置默認值:
let a, b; // 設置默認值 [a = 5, b = 7] = [1]; console.log(a); // 1 console.log(b); // 7
在上面的例子中,我們給a和b均設置了默認值
這種情況下,如果a或b的值是undefined,它將把設置的默認值賦給相應變量(5賦給a,7賦給b)
交換變量值
以往我們進行兩個變量的交換,都是使用
//交換ab c = a; a = b; b = c;
或者異或的方法
然而在解構賦值中,我們可以在一個解構表達式中交換兩個變量值
let a = 1; let b = 3; //交換a和b的值 [a, b] = [b, a]; console.log(a); // 3 console.log(b); // 1
解構函數返回的數組
我們可以直接解構一個返回值為數組的函數
function c() { return [10, 20]; } let a, b; [a, b] = c(); console.log(a); // 10 console.log(b); // 20
在上面的例子中,**c()**的返回值[10,20]可以在單獨的同一行代碼中使用解構
忽略返回值(或跳過某一項)
你可以有選擇性的跳過一些不想得到的返回值
function c() { return [1, 2, 3]; } let [a, , b] = c(); console.log(a); // 1 console.log(b); // 3
賦值數組剩余值給一個變量
當你使用數組解構時,你可以把賦值數組剩余的部分全部賦給一個變量
let [a, ...b] = [1, 2, 3]; console.log(a); // 1 console.log(b); // [2, 3]
這樣的話b也會變成一個數組了,數組中的項是剩余的所有項
注意:
這里要小心結尾是不能再寫逗號的,如果多了一個逗號將會報錯
let [a, ...b,] = [1, 2, 3]; // SyntaxError: rest element may not have a trailing comma
嵌套數組解構
像對象一樣,數組也可以進行嵌套解構
示例:
const color = ['#FF00FF', [255, 0, 255], 'rgb(255, 0, 255)']; // Use nested destructuring to assign red, green and blue // 使用嵌套解構賦值 red, green, blue const [hex, [red, green, blue]] = color; console.log(hex, red, green, blue); // #FF00FF 255 0 255
字符串解構
在數組解構中,解構的目標若為可遍歷對象,皆可進行解構賦值,可遍歷對象即實現Iterator接口的數據
let [a, b, c, d, e] = 'hello'; /* a = 'h' b = 'e' c = 'l' d = 'l' e = 'o' */
對象解構
基礎對象解構
let x = { y: 22, z: true }; let { y, z } = x; // let {y:y,z:z} = x;的簡寫 console.log(y); // 22 console.log(z); // true
賦值給新變量名
當使用對象解構時可以改變變量的名稱
let o = { p: 22, q: true }; let { p: foo, q: bar } = o; console.log(foo); // 22 console.log(bar); // true
如上代碼var {p: foo} = o 獲取對象 o 的屬性名 p,然后賦值給一個名稱為 foo 的變量
解構默認值
如果解構取出的對象值是undefined,我們可以設置默認值
let { a = 10, b = 5 } = { a: 3 }; console.log(a); // 3 console.log(b); // 5
賦值給新對象名的同時提供默認值
前面提到過我們賦值給新的對象名,這里我們可以給這個新的對象名提供一個默認值,如果沒有解構它,就會自動使用默認值
let { a: aa = 10, b: bb = 5 } = { a: 3 }; console.log(aa); // 3 console.log(bb); // 5
同時使用數組和對象解構
在結構中數組和對象可以一起使用
const props = [ { id: 1, name: 'Fizz' }, { id: 2, name: 'Buzz' }, { id: 3, name: 'FizzBuzz' }, ]; const [, , { name }] = props; console.log(name); // "FizzBuzz"
不完全解構
let obj = {p: [{y: 'world'}] }; let {p: [{ y }, x ] } = obj;//不解構x // x = undefined // y = 'world'
賦值剩余值給一個對象
let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}; // a = 10 // b = 20 // rest = {c: 30, d: 40}
嵌套對象解構(可忽略解構)
let obj = {p: ['hello', {y: 'world'}] }; let {p: [x, { y }] } = obj; // x = 'hello' // y = 'world' let obj = {p: ['hello', {y: 'world'}] }; let {p: [x, { }] } = obj;//忽略y // x = 'hello'
注意事項
小心使用已聲明變量進行解構
錯誤示范:
let x; {x} = {x: 1};
JavaScript引擎會將{x}理解為一個代碼塊,從而產生語法錯誤,我們要避免將大括號寫在行首,避免JavaScript將其解釋為代碼塊
正確寫法:
let x; ({x} = {x: 1});
正確寫法將整個解構賦值語句放在一個圓括號里,就可以正確執行了
函數參數的解構賦值
函數的參數也可以使用解構賦值
function add([x, y]) { return x + y; } add([1, 2]);
上面代碼中,函數add的參數表面上是一個數組,但在傳參的時候,數組參數就被解構為變量x和y了,對于函數內部來說,就和直接傳入x和y是一樣的
解構的用途
解構賦值的用法很多
交換變量的值
let x = 1; let y = 2; [x, y] = [y, x];
上面的代碼交換x和y的值,這樣的寫法不僅簡潔而且易讀,語義清晰
從函數返回多個值
函數只能返回一個值,如果要返回多個值,我們只能將這些值放置數組或對象里返回,當我們有了解構賦值后,從對象或數組里取出這些值猶如探囊取物
// 返回一個數組 function example() { return [1, 2, 3]; } let [a, b, c] = example(); // 返回一個對象 function example() { return { foo: 1, bar: 2 }; } let { foo, bar } = example();
提取JSON數據
解構賦值對于提取JSON對象中的數據,尤其有用
示例:
let jsonData = { id: 42, status: "OK", data: [867, 5309] }; let { id, status, data: number } = jsonData; console.log(id, status, number); // 42, "OK", [867, 5309]
使用上面的代碼,我們就可以快速取出JSON數據中的值
總結
原文鏈接:https://blog.csdn.net/m0_61607810/article/details/122164638
相關推薦
- 2022-10-15 Python?pycharm提交代碼遇到沖突解決方法_python
- 2022-10-11 python格式化字符串的實戰教程(使用占位符、format方法)_python
- 2022-10-29 .Net?Core?配置文件讀取IOptions,IOptionsMonitor,IOptionsS
- 2022-05-01 pytorch中的torch.nn.Conv2d()函數圖文詳解_python
- 2023-05-21 Django項目搭建之實現簡單的API訪問_python
- 2022-06-22 android使用intent傳遞參數實現乘法計算_Android
- 2022-06-30 C語言從基礎到進階全面講解數組_C 語言
- 2022-06-10 Asp.Net?Core使用Ocelot結合Consul實現服務注冊和發現_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支