成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ES6學習之 -- 解構(gòu)(使數(shù)據(jù)訪問更便捷)

mrcode / 841人閱讀

摘要:數(shù)組的解構(gòu)賦值規(guī)定允許按照一定模式,從數(shù)組和對象中提取值對變量進行賦值,我們稱之為解構(gòu)。的規(guī)則是,只要有可能導致解構(gòu)的歧義,就不得使用圓括號。

數(shù)組的解構(gòu)賦值
ES6規(guī)定:允許按照一定模式,從數(shù)組和對象中提取值對變量進行賦值,我們稱之為解構(gòu)。
以前賦值只能直接指定值
let a = 1;
let b = 2;
let c = 3;

ES6允許以下這種做法

let [a, b, c] = [1, 2, 3];

上面代碼表示可以從數(shù)組中抽取值賦給對應位置的變量
當然如果解構(gòu)不成功,變量的值就為undefined

let [foo] = [];
let [bar, line] = [1];
//foo是undefined bar是1 line是undefined

如果等號右邊的不是數(shù)組(或者說不可遍歷的解構(gòu)),就會報錯

//以下都會報錯
let [foo] = null;
let [foo] = undefined;
let [foo] = 1;
let [foo] = NaN;
let [foo] = false;
let [foo] = {};

默認值
數(shù)組解構(gòu)可以賦默認值
當數(shù)組解構(gòu)進行賦值的時候會先判斷對應位置上是否有值(判斷規(guī)則是嚴格等于===),如果不存在的話默認值才會生效

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并未執(zhí)行,因為解構(gòu)的時候發(fā)現(xiàn)有對應的值 x = 1

當然默認值可以取已經(jīng)存在的變量的值,記住是已經(jīng)存在的。

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能取到值 所以默認值的賦值操作壓根不會執(zhí)行
對象的解構(gòu)賦值

第一部分我們知道數(shù)組解構(gòu)賦值是按照順序來的,對象就不一樣了,對象的屬性并沒有順序,對象的解構(gòu)賦值是按照屬性名來的。
變量名與屬性名一樣的情況:

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"};

對象與數(shù)組結(jié)合后可以組成嵌套模式

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"]

同樣的對象的解構(gòu)也可以設置默認值,默認值生效的條件是,對象的屬性值嚴格等于undefined。

let {x = 0} = {};
let {obj = {}} = {obj: null};
x//0
obj//null

解構(gòu)失敗的話變量被賦予undefined

let { x } = {};
x//undefined

如果解構(gòu)模式是嵌套的對象,子對象所在的父屬性不存在就會報錯。

let {user: { name }} = {foo: "test"};
//報錯 因為name的父屬性不存在

如果對一個已經(jīng)聲明的變量進行解構(gòu)賦值一定要注意

let x;
{ x } = { x: 0 };
//報錯 語法錯誤 JavaScript會把{x}當作代碼塊

為了避免以上的錯誤應該避免大括號位于行首,我們應該將解構(gòu)賦值放在圓括號內(nèi)。

let x;
({ x } = { x: 0 });
x//0

對象的解構(gòu)賦值可以很方便的將已有的方法賦值到變量中方便使用

let {sin,cos,log,PI} = Math;
sin(PI/6)

因為數(shù)組是一種特殊的對象,所以可以對數(shù)組使用對象進行解構(gòu)

let arr = [1, 2, 3];
let {0: test, [arr.length - 1]: name} = arr;
test//1
name//3
字符串的解構(gòu)賦值

字符串也可以解構(gòu)賦值,因為此時字符串會被當做一個類似數(shù)組的對象

let [first, , , ,last] = "12345";
first//"1"
last//"5"

類似數(shù)組的對象都有長度length屬性

let { length } = "12345";
length//5
數(shù)值與布爾值的解構(gòu)賦值

若果是對數(shù)字或者布爾值進行解構(gòu),會先將數(shù)字或者布爾值轉(zhuǎn)換成對象

let {toString: s} = 123;
s === Number.prototype.toString//true
let {toString: s} = true;
s === Boolean.prototype.toString//true

特別注意undefined與null無法轉(zhuǎn)換為對象,對他們進行解構(gòu)都會報錯

let { prop: x } = undefined; // 報錯
let { prop: y } = null; // 報錯
函數(shù)參數(shù)的解構(gòu)賦值
function test([x, y]) {
    return x + y;
}
test([1, 2]);//3
參數(shù)傳遞到函數(shù)的那一刻被解構(gòu)成x和y了
圓括號問題(摘自阮一峰老師《ECMAScript 6 入門》)

解構(gòu)賦值雖然很方便,但是解析起來并不容易。對于編譯器來說,一個式子到底是模式,還是表達式,沒有辦法從一開始就知道,必須解析到(或解析不到)等號才能知道。

由此帶來的問題是,如果模式中出現(xiàn)圓括號怎么處理。ES6 的規(guī)則是,只要有可能導致解構(gòu)的歧義,就不得使用圓括號。

但是,這條規(guī)則實際上不那么容易辨別,處理起來相當麻煩。因此,建議只要有可能,就不要在模式中放置圓括號。
不能使用圓括號的情況
(1)變量聲明語句

// 全部報錯
let [(a)] = [1];

let {x: (c)} = {};
let ({x: c}) = {};
let {(x: c)} = {};
let {(x): c} = {};

let { o: ({ p: p }) } = { o: { p: 2 } };

(2)函數(shù)參數(shù)

// 報錯
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)從函數(shù)返回多個值

function getParams() {
    return {name: "Jason", id: 411, age: 24};
}
let {name, id, age} = getParams();

(3)函數(shù)參數(shù)的定義

function test([x, y, z]) {}
test([1, 2, 3]);

function test({ x, y, z }) {}
test({ x: 1, y: 2, z: 3 });

(4)提取 JSON 數(shù)據(jù)

const jsonData = {
    name: "Jason",
    id: 411,
    age: 24
};
let {name, id, age: yearOld} = jsonData;
console.log(name, id, yearOld);//Jason 411 24

(5)函數(shù)參數(shù)的默認值

jQuery.ajax = function (url, {
  async = true,
  beforeSend = function () {},
  cache = true,
  complete = function () {},
  crossDomain = false,
  global = true
}) {
};

(6)遍歷 Map 結(jié)構(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

(7)輸入模塊的指定方法

import {mapState, mapGetters, mapMutations, mapActions, createNamespacedHelpers} from "vuex";

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90565.html

相關文章

  • 《深入理解ES6》筆記——解構(gòu)使數(shù)據(jù)訪問便捷(5)

    摘要:解構(gòu),一種黑魔法解構(gòu)是從對象中提取出更小元素的過程。賦值是對解構(gòu)出來的元素進行重新賦值??偨Y(jié)本章講解了對象解構(gòu)賦值和數(shù)組解構(gòu)賦值,以及對象和數(shù)組混合情況下的解構(gòu)賦值操作,最后一個知識點是解構(gòu)函數(shù)的參數(shù)。 解構(gòu),一種黑魔法 解構(gòu)是從對象中提取出更小元素的過程。賦值是對解構(gòu)出來的元素進行重新賦值。 下面的代碼你可能無法在瀏覽器上實時測試,推薦在babel官網(wǎng)在線測試代碼:在線測試ES6代碼...

    Drinkey 評論0 收藏0
  • 深入理解ES6筆記(五)解構(gòu)使訪問數(shù)據(jù)便捷

    摘要:當冒號右側(cè)存在花括號時,表示目標被嵌套在對象的更深一層中。在對象的嵌套解構(gòu)中同樣能為本地變量使用不同的名稱提取數(shù)組解構(gòu)結(jié)構(gòu)賦值基本忽略一些選項重新賦值默認值數(shù)組解構(gòu)賦值同樣允許在數(shù)組任意位置指定默認值。 主要知識點:對象解構(gòu)、數(shù)組解構(gòu)、混合解構(gòu)以及參數(shù)解構(gòu)showImg(https://segmentfault.com/img/bVbfWgH?w=1020&h=585); 《深入理解...

    _DangJin 評論0 收藏0
  • ES6】對象的新功能與解構(gòu)賦值

    摘要:通過字面量語法擴展新增方法改進原型等多種方式加強對象的使用,并通過解構(gòu)簡化對象的數(shù)據(jù)提取過程。四解構(gòu)賦值為數(shù)組和對象字面量提供了新特性解構(gòu),可以簡化數(shù)據(jù)提取的過程,減少同質(zhì)化的代碼。 ES6 通過字面量語法擴展、新增方法、改進原型等多種方式加強對象的使用,并通過解構(gòu)簡化對象的數(shù)據(jù)提取過程。 一、字面量語法擴展 在 ES6 模式下使用字面量創(chuàng)建對象更加簡潔,對于對象屬性來說,屬性初始值可...

    Lowky 評論0 收藏0
  • 【搶先領】《React 習之道》我們翻譯了一本最簡單,且最實用的 React 實戰(zhàn)教程……

    摘要:學習之道簡體中文版通往實戰(zhàn)大師之旅掌握最簡單,且最實用的教程。前言學習之道這本書使用路線圖中的精華部分用于傳授,并將其融入一個獨具吸引力的真實世界的具體代碼實現(xiàn)。完美展現(xiàn)了的優(yōu)雅。膜拜的學習之道是必讀的一本書。 《React 學習之道》The Road to learn React (簡體中文版) 通往 React 實戰(zhàn)大師之旅:掌握 React 最簡單,且最實用的教程。 showIm...

    oneasp 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<