解構通俗點說,就是通過一種特定格式,快捷的讀取對象/數組中的數據的方法, es6之前,我們通過對象名稱[鍵] 讀取數據 上面第5行就是一個簡單的數據解構過程: 1,右邊如果是對象,左邊解構的語法也要用對象格式, 如果解構的數據是數組,左邊就用數組格式 2,name, age是局部變數 3,解構出來的 ...
解構通俗點說,就是通過一種特定格式,快捷的讀取對象/數組中的數據的方法,
es6之前,我們通過對象名稱[鍵] 讀取數據
1 var User = { 2 'name' : 'ghostwu', 3 'age' : 22 4 }; 5 console.log( User.name, User.age ); //ghostwu, 22
1 var User = { 2 'name' : 'ghostwu', 3 'age' : 22 4 }; 5 let { name, age } = User; 6 console.log( name, age ); //ghostwu 22
上面第5行就是一個簡單的數據解構過程:
1,右邊如果是對象,左邊解構的語法也要用對象格式, 如果解構的數據是數組,左邊就用數組格式 2,name, age是局部變數 3,解構出來的變數 一定要是 對象中能夠查找到的屬性名 4,如果解構出來的屬性在對象中查找不到,值為undefined1 var User = { 2 'name' : 'ghostwu', 3 'age' : 22 4 }; 5 let { name1, age1 } = User; 6 console.log( name1, age1 ); //undefined, undefined
解構出來的變數雖然是跟屬性名稱相同,但是他不再是屬性,而是外部的變數,這個變數名也可以被修改, 不一定要跟屬性同名
1 var User = { 2 'name' : 'ghostwu', 3 'age' : 22 4 }; 5 //解構出來的變數可以更改名稱 6 let { name : name1, age : age1 } = User; 7 // console.log( name, age ); //報錯, 因為name和age的名稱已經被改了 8 console.log( name1, age1 ); //ghost, 22
更改解構出來的變數名稱的語法: 舊的名稱 : 新的名稱
1 var User = { 2 'name': 'ghostwu', 3 'age': 22 4 }; 5 6 let { name, age, sex } = User; 7 // 解構出來的屬性,如果不存在,預設值為undefined 8 console.log( name, age, sex ); //ghost 22 undefined
1 var User = { 2 'name': 'ghostwu', 3 'age': 22 4 }; 5 // 解構出來的值 可以賦值 一個預設的值 6 let { name, age, sex = 'man' } = User; 7 console.log( name, age, sex );
上述實例,為sex賦值了一個預設值 'man';
解構數組
1 let arr = [ 10, 20, 30, 40 ]; 2 3 // 數組用[]解構 4 let [ one, two ] = arr; 5 console.log( one, two ); //10 20
1 let arr = [ 10, 20, 30, 40 ]; 2 // 對於不需要解構的值,可以用逗號占位 3 let [ , , , a ] = arr; 4 console.log( a ); //40
解構嵌套數組
1 let arr = [ 10, [ 20, 30 ], 40 ]; 2 console.log( arr[1][1] ); //30 3 let [ one, two, three, four ] = arr; 4 console.log( one, two, three, four ); //10 [20, 30] 40 undefined 5 [ one, [ two, three ], four ] = arr; //前面不要let,否則會報重定義錯誤 6 console.log( one, two, three, four ); //10 20 30 40
在以前,我們交換變數,一般的做法是藉助第三個變數, 而現在有瞭解構之後,我們可以直接交換
1 /* 2 交換兩個變數的值 3 */ 4 let a = 10, b = 20; 5 [ a, b ] = [ b, a ]; //前面不要加let,否則會報 重定義錯誤 6 console.log( a, b ); //20, 10
利用解構出來的值,修改局部變數的值
1 let User = { 2 name : 'ghostwu', 3 age : 22 4 }, 5 name = 'zhangsan', 6 age = 30; 7 8 //小括弧: 把下麵這個 轉成解構表達式, 如果不用小括弧會報錯 9 ({ name, age } = User); 10 console.log( name, age ); //ghostwu, 22
1 let name = 'zhangsan', age = 40; 2 ({ name, age } = { 3 name, 4 age 5 }); 6 7 console.log( name, age ); //zhangsan 40
上述實例,是一個對象賦值的簡寫語法,你還記得嗎?
1 let User = { 2 name : 'ghostwu', 3 age : 22 4 }; 5 6 //重命名局部變數,mySex:賦初始值 7 let { name : myName, age : myAge, sex : mySex = 'man' } = User; 8 console.log( myName, myAge, mySex ); //ghostwu 22 man
解構表達式傳參
1 let User = { 2 name : 'ghostwu', 3 age : 22 4 }; 5 6 function show( obj ){ 7 console.log( obj ); //obj其實就是User對象 8 console.log( obj === User ); //true 9 //函數中可以訪問在參數中解構出來的變數 10 console.log( name, age ); //ghostwu, 22 11 } 12 show( { name, age } = User ); //表達式傳值,整個表達式的值 取決於右邊,所以把User傳給了obj 13 console.log( name, age ); //ghostwu, 22
嵌套對象的解構
1 let User = { 2 name : 'ghostwu', 3 age : 22, 4 class : { 5 group1 : { 6 one : '王超', 7 two : '馬漢' 8 }, 9 group2 : { 10 one : '張龍', 11 two : '趙虎' 12 } 13 } 14 }; 15 //在User對象解構class, 在class中解構group1 16 let { class : { group1 } } = User; 17 console.log( group1.one ); //王超 18 console.log( group1.two ); //馬漢 19 20 //在User對象解構class, 在class中解構group1, 在group1中解構one, two 21 ({ class : { group1 : { one, two } } } = User); 22 console.log( one, two ); //王超, 馬漢 23 24 //重命名group1 為 diyizu 25 ({ class : { group1 : diyizu } } = User); 26 console.log( diyizu.one ); //王超 27 console.log( diyizu.two ); //馬漢 28 29 //three 賦預設值 30 ({ class : { group1 : { one, two, three = '展昭' } } } = User); 31 console.log( one, two, three );//王超,馬漢,展昭
解構中的不定參數(...)
let arr = [ 10, 20, 30 ]; let [ one, ...others ] = arr; console.log( others.length ); //2 console.log( one ); //10 console.log( others[0] ); //20 console.log( others[1] ); //30
1 //es6之前,用concat複製數組 2 let arr = [ 10, 20, 30 ]; 3 let newArr = arr.concat(); 4 console.log( newArr );
1 //用解構與不定參數結合 複製 數組 2 let arr = [ 10, 20, 30 ]; 3 let [ ...newArr ] = arr; 4 console.log( newArr );
最後一道綜合練習題: 對象與數組的混合解構,能看懂,基本就算掌握了
1 let User = { 2 name : 'ghostwu', 3 age : 22, 4 class : { 5 group1 : { 6 one : '王超', 7 two : '馬漢' 8 }, 9 group2 : { 10 one : '張龍', 11 two : '趙虎' 12 } 13 }, 14 arr : [ 10, 20, 30 ] 15 }; 16 17 // let { name, age, class : { group1 }, arr } = User; 18 let { name, age, class : { group1, group2 }, arr : [ one, two, three ] } = User; 19 // console.log( name, age, group1.one, group1.two, arr ); 20 console.log( name, age, group1.one, group1.two, group2.one, group2.two, one, two, three );