詳解JS ES6變量的解構(gòu)賦值
ES6允許按照一定模式,從數(shù)組和對象中提取值,對變量進(jìn)行賦值,這被稱為解構(gòu)。它在語法上比ES5所提供的更加簡潔、緊湊、清晰。它不僅能減少你的代碼量,還能從根本上改變你的編碼方式。
2.數(shù)組解構(gòu)以前,為變量賦值,我們只能直接指定值,比如
let a = 1;let b = 2; let c = 3;
現(xiàn)在可以用數(shù)組解構(gòu)的方式來進(jìn)行賦值
let [a, b, c] = [1, 2, 3];console.log(a, b, c); // 1, 2, 3
這是數(shù)組解構(gòu)最基本類型的用法,還可以解構(gòu)對象數(shù)組
// 對象數(shù)組解構(gòu)let [a, b, c] = [{name: ’jacky’}, {name: ’monkey’}, {name: ’houge’}];console.log(a, b, c); // {name: ’jacky’}, {name: ’monkey’}, {name: ’houge’}3.數(shù)組模式和賦值模式統(tǒng)一
這條可以理解為等號左邊和等號右邊的形式要統(tǒng)一,如果不統(tǒng)一解構(gòu)將失敗。
let [a, [b, c], d] = [1, [2, 3], 4];console.log(a, b, c, d); // 1 2 3 4 // 提取除第二、三個外的所有數(shù)值let [a, , , d] = [1, 2, 3, 4];console.log(a, d); //1 4 let [a, ...b] = [1, 2, 3, 4];console.log(a, b); // 1 [2, 3, 4]let [a, , , ...d] = [1, 2, 3, 4, 5];console.log(a, d); // 1 [4, 5]如果解構(gòu)不成功,變量的值就等于undefinedlet [a, b, c] = [2, 3];console.log(a, b, c); // 2 3 undefinedlet [c] = [];console.log(c); // undefined
如果解構(gòu)不成功,變量的值就等于undefined
let [a, b, c] = [2, 3];console.log(a, b, c); // 2 3 undefinedlet [c] = [];console.log(c); // undefined
上述是完全解構(gòu)的情況,還有一種是不完全解構(gòu),即等號左邊的模式,只匹配一部分的等號右邊的數(shù)組,解構(gòu)依然可以成功。
let [x, y] = [1, 2, 3]; console.log(x, y); // 1 2let [a, [b], d] = [1, [2, 3], 4];console.log(a, b, d); // 1 2 44.解構(gòu)的默認(rèn)值
解構(gòu)賦值允許指定默認(rèn)值。
let [a, b=2] = [1];console.log(a, b); // 1 2let [a=1, b=2, c, d=13] = [10, 11, 12];console.log(a, b, c, d); // 10 11 12 135.對象的解構(gòu)賦值
對象的解構(gòu)與數(shù)組有一個重要的不同。數(shù)組的元素是按次序排列的,變量的取值由它的位置決定;而對象的屬性沒有次序,變量必須與屬性同名,才能取到正確的值。
// 對象解構(gòu)賦值的內(nèi)部機(jī)制,是先找到同名屬性,然后再賦給對應(yīng)的變量。真正被賦值的是后者,而非前者。let obj = { a: 'aaa', b: 'bbb' };let { a: x, b: y } = obj; console.log(x, y); // aaa bbblet { a, b } = { a: ’aaa’, b: ’bbb’ };console.log(a, b); // aaa bbb// 不按照順序let { b, a } = { a: ’test1’, b: ’test2’ }console.log(a, b) // test1 test2// 嵌套解構(gòu)let { obj: { name }} = { obj: { name: ’jacky’, age: ’22’ } }console.log(name) // jacky// 稍微復(fù)雜的嵌套let obj = { p: [’Hello’,{ y: ’World’ } ]};let { p: [x, { y }] } = obj;console.log(x, y); // Hello World
如果變量名與屬性名不一致,必須寫成下面這樣。
var { foo: rename } = { foo: 'aaa',bar: 'bbb' };console.log(rename); // aaaconsole.log(foo); // Uncaught ReferenceError: foo is not defined
如果在解構(gòu)之前就定義了變量,這時候再解構(gòu)會出現(xiàn)問題。下面是錯誤的代碼,編譯會報錯(因為js引擎會將{a}理解成一個代碼塊,從而發(fā)生語法錯誤。只有不將大括號寫在行首,避免js將其解釋成代碼塊,才能解決這個問題)
let a;let obj = { a: 'aaa' };{a} = obj; // Uncaught SyntaxError: Unexpected token ’=’
要解決報錯,使程序正常,這時候只要在解構(gòu)的語句外邊加一個圓括號就可以了
let a;let obj = { a: 'aaa' };( {a} = obj );console.log(a); // aaa6.函數(shù)參數(shù)
函數(shù)的參數(shù)也可以使用解構(gòu)賦值。
function add([x, y]){ return x + y;}add([1, 2]); // 3
函數(shù)參數(shù)的解構(gòu)也可以使用默認(rèn)值。
function fn(x, y = 7) { return x + y;}console.log(fn(3)); // 107.字符串解構(gòu)
字符串被轉(zhuǎn)換成了一個類似數(shù)組的對象。
const [a, b, c, d, e, f] = 'hello';console.log(a); //hconsole.log(b); //econsole.log(c); //lconsole.log(d); //lconsole.log(e); //oconsole.log(f); //undefined8.數(shù)值和布爾值的解構(gòu)賦值
解構(gòu)賦值時,如果等號右邊是數(shù)值和布爾值,則會先轉(zhuǎn)為對象。
let {toString: s} = 0;console.log(s === Number.prototype.toString); // truelet {toString: s} = true;console.log(s === Boolean.prototype.toString); // true
解構(gòu)賦值的規(guī)則是,只要等號右邊的值不是對象或數(shù)組,就先將其轉(zhuǎn)為對象。由于undefined和null無法轉(zhuǎn)為對象,所以對它們進(jìn)行解構(gòu)賦值,都會報錯
let { prop: x } = undefined; // TypeErrorlet { prop: y } = null; // TypeError9.解構(gòu)賦值的應(yīng)用1.交換變量的值
通常交換兩個變量的方法需要一個額外的臨時變量,如下
let a = 1;let b = 2;let temp;temp = a;a = b;b = temp;console.log(a, b); // 2 1
用ES6解構(gòu)賦值的話,會變得很簡潔
let a = 1;let b = 2;[a, b] = [b ,a];console.log(a, b); // 2 12.從函數(shù)返回多個值
函數(shù)只能返回一個值,如果要返回多個值,只能將它們放在數(shù)組或?qū)ο罄锓祷?。有了解?gòu)賦值,取出這些值就非常方便。
// 返回一個數(shù)組function example() { return [1, 2, 3];}let [a, b, c] = example();// 返回一個對象function example() { return { foo: 1, bar: 2 };}let { foo, bar } = example();3.訪問數(shù)組中元素
有種場景,比如有一個數(shù)組(可能為空)。并且希望訪問數(shù)組的第一個、第二個或第n個項,但如果該項不存在,則使用指定默認(rèn)值。
通常會使用數(shù)組的length屬性來判斷
const list = [];let firstItem = ’hello’;if (list.length > 0) { firstItem = list[0];}console.log(firstItem); // hello
如果用ES6解構(gòu)賦值來實(shí)現(xiàn)上述邏輯
const list = [];const [firstItem = ’hello’] = list;console.log(firstItem); // ’hello’4.提取 JSON數(shù)據(jù)
let jsonData = { id: 42, status: 'OK', data: [867, 5309]};let { id, status, data: number } = jsonData;console.log(id, status, number);// 42, 'OK', [867, 5309]5.遍歷 Map 結(jié)構(gòu)
任何部署了 Iterator 接口的對象,都可以用for...of循環(huán)遍歷。Map 結(jié)構(gòu)原生支持 Iterator 接口,配合變量的解構(gòu)賦值,獲取鍵名和鍵值就非常方便。
const map = new Map();map.set(’first’, ’hello’);map.set(’second’, ’world’);for (let [key, value] of map) { console.log(key + ' is ' + value);}// first is hello// second is world
如果只想獲取鍵名,或者只想獲取鍵值,可以寫成下面這樣。
// 獲取鍵名for (let [key] of map) { // ...}// 獲取鍵值for (let [,value] of map) { // ...}
以上就是詳解JS ES6變量的解構(gòu)賦值的詳細(xì)內(nèi)容,更多關(guān)于JS ES6變量解構(gòu)賦值的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. asp讀取xml文件和記數(shù)2. PHP實(shí)現(xiàn)基本留言板功能原理與步驟詳解3. CSS自定義滾動條樣式案例詳解4. vue 驗證兩次輸入的密碼是否一致的方法示例5. 每日六道java新手入門面試題,通往自由的道路第二天6. 讓你的PHP同時支持GIF、png、JPEG7. python利用opencv實(shí)現(xiàn)顏色檢測8. 簡體中文轉(zhuǎn)換為繁體中文的PHP函數(shù)9. 多個SpringBoot項目采用redis實(shí)現(xiàn)Session共享功能10. JavaScript快速實(shí)現(xiàn)一個顏色選擇器
