摘要:數組的解構賦值規定允許按照一定模式,從數組和對象中提取值對變量進行賦值,我們稱之為解構。的規則是,只要有可能導致解構的歧義,就不得使用圓括號。
數組的解構賦值
ES6規定:允許按照一定模式,從數組和對象中提取值對變量進行賦值,我們稱之為解構。
以前賦值只能直接指定值
let a = 1; let b = 2; let c = 3;
ES6允許以下這種做法
let [a, b, c] = [1, 2, 3];
上面代碼表示可以從數組中抽取值賦給對應位置的變量
當然如果解構不成功,變量的值就為undefined
let [foo] = []; let [bar, line] = [1]; //foo是undefined bar是1 line是undefined
如果等號右邊的不是數組(或者說不可遍歷的解構),就會報錯
//以下都會報錯 let [foo] = null; let [foo] = undefined; let [foo] = 1; let [foo] = NaN; let [foo] = false; let [foo] = {};
默認值
數組解構可以賦默認值
當數組解構進行賦值的時候會先判斷對應位置上是否有值(判斷規則是嚴格等于===),如果不存在的話默認值才會生效
let [foo] = [true];//foo = true; let [x, y = "b"] = ["a"];//x = "a"; y = "b"; let [x, y = "b"] = ["a", undefined];//x = "a"; y = "b"; let [x, y = "b"] = ["a", null];//x = "a"; y = null;
若果默認值是一個表達式,那么這個表達式是惰性的,只有在用到的時候才會求值
function getFoo() { console.log("log: doing"); return "foo"; } let [x = getFoo()] = [1];//getFoo并未執行,因為解構的時候發現有對應的值 x = 1
當然默認值可以取已經存在的變量的值,記住是已經存在的。
let [x = 0, y = x] = [];//x = 0; y = 0; let [x = y, y = 0] = [];//報錯因為x需要默認值的時候y還不存在 let [x = y, y = 0] = [1];//x = 1;y = 0;因為x能取到值 所以默認值的賦值操作壓根不會執行對象的解構賦值
第一部分我們知道數組解構賦值是按照順序來的,對象就不一樣了,對象的屬性并沒有順序,對象的解構賦值是按照屬性名來的。
變量名與屬性名一樣的情況:
let {foo, bar, line} = {foo: "Hello", bar: "ES6"}; foo //"Hello" bar //"ES6" line//undefined
變量名與屬性名不一樣的情況:
let {foo: fooTest} = {foo: "Jason"}; fooTest//"Jason"
當然同名的完全可以理解成
let {foo: foo, bar: bar, line: line} = {foo: "Hello", bar: "ES6"};
對象與數組結合后可以組成嵌套模式
let { test: [ name ], mod } = { test: ["Jason"], mod: "Hello" } mod//"Hello" name//"Jason" test//報錯 test is not defined
上個例子中如果想要獲取test需要先定義
let { test, test: [ name ], mod } = { test: ["Jason"], mod: "Hello" } mod//"Hello" name//"Jason" test//["Jason"]
同樣的對象的解構也可以設置默認值,默認值生效的條件是,對象的屬性值嚴格等于undefined。
let {x = 0} = {}; let {obj = {}} = {obj: null}; x//0 obj//null
解構失敗的話變量被賦予undefined
let { x } = {}; x//undefined
如果解構模式是嵌套的對象,子對象所在的父屬性不存在就會報錯。
let {user: { name }} = {foo: "test"}; //報錯 因為name的父屬性不存在
如果對一個已經聲明的變量進行解構賦值一定要注意
let x; { x } = { x: 0 }; //報錯 語法錯誤 JavaScript會把{x}當作代碼塊
為了避免以上的錯誤應該避免大括號位于行首,我們應該將解構賦值放在圓括號內。
let x; ({ x } = { x: 0 }); x//0
對象的解構賦值可以很方便的將已有的方法賦值到變量中方便使用
let {sin,cos,log,PI} = Math; sin(PI/6)
因為數組是一種特殊的對象,所以可以對數組使用對象進行解構
let arr = [1, 2, 3]; let {0: test, [arr.length - 1]: name} = arr; test//1 name//3字符串的解構賦值
字符串也可以解構賦值,因為此時字符串會被當做一個類似數組的對象
let [first, , , ,last] = "12345"; first//"1" last//"5"
類似數組的對象都有長度length屬性
let { length } = "12345"; length//5數值與布爾值的解構賦值
若果是對數字或者布爾值進行解構,會先將數字或者布爾值轉換成對象
let {toString: s} = 123; s === Number.prototype.toString//true
let {toString: s} = true; s === Boolean.prototype.toString//true
特別注意undefined與null無法轉換為對象,對他們進行解構都會報錯
let { prop: x } = undefined; // 報錯 let { prop: y } = null; // 報錯函數參數的解構賦值
function test([x, y]) { return x + y; } test([1, 2]);//3 參數傳遞到函數的那一刻被解構成x和y了圓括號問題(摘自阮一峰老師《ECMAScript 6 入門》)
解構賦值雖然很方便,但是解析起來并不容易。對于編譯器來說,一個式子到底是模式,還是表達式,沒有辦法從一開始就知道,必須解析到(或解析不到)等號才能知道。
由此帶來的問題是,如果模式中出現圓括號怎么處理。ES6 的規則是,只要有可能導致解構的歧義,就不得使用圓括號。
但是,這條規則實際上不那么容易辨別,處理起來相當麻煩。因此,建議只要有可能,就不要在模式中放置圓括號。
不能使用圓括號的情況
(1)變量聲明語句
// 全部報錯 let [(a)] = [1]; let {x: (c)} = {}; let ({x: c}) = {}; let {(x: c)} = {}; let {(x): c} = {}; let { o: ({ p: p }) } = { o: { p: 2 } };
(2)函數參數
// 報錯 function f([(z)]) { return z; } // 報錯 function f([z,(x)]) { return x; }
(3)賦值語句的模式
// 全部報錯 ({ p: a }) = { p: 42 }; ([a]) = [5]; // 報錯 [({ p: a }), { x: c }] = [{}, {}];
可以使用圓括號的情況
可以使用圓括號的情況只有一種:賦值語句的非模式部分,可以使用圓括號。
[(b)] = [3]; // 正確 ({ p: (d) } = {}); // 正確 [(parseInt.prop)] = [3]; // 正確用途
(1)交換變量的值
let x = 1; let y = 2; [x, y] = [y, x];
(2)從函數返回多個值
function getParams() { return {name: "Jason", id: 411, age: 24}; } let {name, id, age} = getParams();
(3)函數參數的定義
function test([x, y, z]) {} test([1, 2, 3]); function test({ x, y, z }) {} test({ x: 1, y: 2, z: 3 });
(4)提取 JSON 數據
const jsonData = { name: "Jason", id: 411, age: 24 }; let {name, id, age: yearOld} = jsonData; console.log(name, id, yearOld);//Jason 411 24
(5)函數參數的默認值
jQuery.ajax = function (url, { async = true, beforeSend = function () {}, cache = true, complete = function () {}, crossDomain = false, global = true }) { };
(6)遍歷 Map 結構
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
(7)輸入模塊的指定方法
import {mapState, mapGetters, mapMutations, mapActions, createNamespacedHelpers} from "vuex";
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90565.html
摘要:解構,一種黑魔法解構是從對象中提取出更小元素的過程。賦值是對解構出來的元素進行重新賦值。總結本章講解了對象解構賦值和數組解構賦值,以及對象和數組混合情況下的解構賦值操作,最后一個知識點是解構函數的參數。 解構,一種黑魔法 解構是從對象中提取出更小元素的過程。賦值是對解構出來的元素進行重新賦值。 下面的代碼你可能無法在瀏覽器上實時測試,推薦在babel官網在線測試代碼:在線測試ES6代碼...
摘要:當冒號右側存在花括號時,表示目標被嵌套在對象的更深一層中。在對象的嵌套解構中同樣能為本地變量使用不同的名稱提取數組解構結構賦值基本忽略一些選項重新賦值默認值數組解構賦值同樣允許在數組任意位置指定默認值。 主要知識點:對象解構、數組解構、混合解構以及參數解構showImg(https://segmentfault.com/img/bVbfWgH?w=1020&h=585); 《深入理解...
摘要:通過字面量語法擴展新增方法改進原型等多種方式加強對象的使用,并通過解構簡化對象的數據提取過程。四解構賦值為數組和對象字面量提供了新特性解構,可以簡化數據提取的過程,減少同質化的代碼。 ES6 通過字面量語法擴展、新增方法、改進原型等多種方式加強對象的使用,并通過解構簡化對象的數據提取過程。 一、字面量語法擴展 在 ES6 模式下使用字面量創建對象更加簡潔,對于對象屬性來說,屬性初始值可...
摘要:學習之道簡體中文版通往實戰大師之旅掌握最簡單,且最實用的教程。前言學習之道這本書使用路線圖中的精華部分用于傳授,并將其融入一個獨具吸引力的真實世界的具體代碼實現。完美展現了的優雅。膜拜的學習之道是必讀的一本書。 《React 學習之道》The Road to learn React (簡體中文版) 通往 React 實戰大師之旅:掌握 React 最簡單,且最實用的教程。 showIm...
閱讀 870·2021-11-22 09:34
閱讀 1003·2021-10-08 10:16
閱讀 1816·2021-07-25 21:42
閱讀 1790·2019-08-30 15:53
閱讀 3519·2019-08-30 13:08
閱讀 2174·2019-08-29 17:30
閱讀 3342·2019-08-29 17:22
閱讀 2173·2019-08-29 15:35