解構(gòu)賦值和拓展運算符

解構(gòu)

1、數(shù)組解構(gòu)

let [a, b, c] = [1, 2, 3];
console.log(a);  //1

2胎撤、對象的解構(gòu)賦值

let { foo, bar } = { foo: "aaa", bar: "bbb" };
console.log(foo);  //"aaa"

3晓殊、字符串的解構(gòu)賦值

const [a, b, c, d, e] = 'hello';
a // "h"

4、數(shù)值和布爾值的解構(gòu)賦值

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

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

5伤提、函數(shù)參數(shù)的解構(gòu)賦值

function add([x, y]){
  return x + y;
}

add([1, 2]); // 3

上面代碼中巫俺,函數(shù)add的參數(shù)表面上是一個數(shù)組,但在傳入?yún)?shù)的那一刻肿男,數(shù)組參數(shù)就被解構(gòu)成變量x和y介汹。對于函數(shù)內(nèi)部的代碼來說,它們能感受到的參數(shù)就是x和y舶沛。

function move({x = 0, y = 0} = {}) {
  return [x, y];
}

move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
move(); // [0, 0]

函數(shù)參數(shù)的解構(gòu)也可以使用默認值嘹承。

6、for循環(huán)解構(gòu)

var arr = [[11, 12], [21, 22], [31, 32]];
for (let [a, b] of arr) {
    console.log(a);
    console.log(b);
}
//11
//12
//21
//22
//31
//32

擴展運算符

擴展運算符(spread運算符)用三個點號(...)表示如庭,==功能是把數(shù)組或類數(shù)組對象展開成一系列用逗號隔開的值==叹卷。

let foo = function(a, b, c) {
    console.log(a);
    console.log(b);
    console.log(c);
}

let arr = [1, 2, 3];

//傳統(tǒng)寫法
foo(arr[0], arr[1], arr[2]);

//使用擴展運算符
foo(...arr);
//1
//2
//3

特殊應(yīng)用場景:

1、數(shù)組深拷貝-數(shù)組中的元素為基本類型柱彻,若為object豪娜,依然會拷貝引用地址

var arr = [1, 2, 3];
var arr2 = arr;
var arr3 = [...arr];
console.log(arr===arr2); //true, 說明arr和arr2指向同一個數(shù)組的引用地址
console.log(arr===arr3); //false, 說明arr3和arr指向不同數(shù)組引用餐胀,在堆內(nèi)存中為arr3另外分配了內(nèi)存空間

2哟楷、把一個數(shù)組插入另一個數(shù)組字面量

var arr4 = [...arr, 4, 5, 6];
console.log(arr4);//[1, 2, 3, 4, 5, 6]

3、字符串轉(zhuǎn)數(shù)組

var str = 'love';
var arr5 = [...str];
console.log(arr5);//[ 'l', 'o', 'v', 'e' ]

4否灾、函數(shù)調(diào)用

  function push(array, ...items) {
    array.push(...items)
  }

  function add(x, y) {
    return x + y
  }

  const numbers = [4, 38]
  add(...numbers) // 42

5卖擅、替代數(shù)組的 apply 方法

由于擴展運算符可以展開數(shù)組,所以不再需要apply方法,將數(shù)組轉(zhuǎn)為函數(shù)的參數(shù)了惩阶。

// ES5 的寫法
function f(x, y, z) {
// ...
}
var args = [0, 1, 2];
f.apply(null, args);

// ES6 的寫法
function f(x, y, z) {
// ...
}
var args = [0, 1, 2];
f(...args);

另一個例子是通過push函數(shù)挎狸,將一個數(shù)組添加到另一個數(shù)組的尾部。

// ES5 的寫法
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
Array.prototype.push.apply(arr1, arr2);

// ES6 的寫法
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
arr1.push(...arr2)

rest運算符

rest運算符也是三個點號断楷,不過其功能與擴展運算符恰好相反锨匆,把逗號隔開的值序列組合成一個數(shù)組。
//主要用于不定參數(shù)冬筒,所以ES6開始可以不再使用arguments對象

var bar = function(...args) {
    for (let el of args) {
        console.log(el);
    }
}

bar(1, 2, 3, 4);
//1
//2
//3
//4

bar = function(a, ...args) {
    console.log(a);
    console.log(args);
}

bar(1, 2, 3, 4);
//1
//[ 2, 3, 4 ]

rest運算符配合解構(gòu)使用:

// 數(shù)組
const [a, ...rest] = [1, 2, 3, 4];
console.log(a);//1
console.log(rest);//[2, 3, 4]

// 對象配合
const {age, ...rest} = {name: 'qxj', age: 24, hobby: 'write code'};
console.log(age);                   //24
console.log(rest);                  //{ name: 'qxj', hobby: 'write code' }

rest運算符和spread運算符的區(qū)別:

spread運算符:放在賦值一方恐锣,即放在實參或者等號右邊
rest運算符:放在被賦值一方,即放在形參或者等號左邊

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舞痰,一起剝皮案震驚了整個濱河市土榴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌响牛,老刑警劉巖玷禽,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異呀打,居然都是意外死亡矢赁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門贬丛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坯台,“玉大人,你說我怎么就攤上這事瘫寝⊙牙伲” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵焕阿,是天一觀的道長咪啡。 經(jīng)常有香客問我,道長暮屡,這世上最難降的妖魔是什么撤摸? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮褒纲,結(jié)果婚禮上准夷,老公的妹妹穿的比我還像新娘。我一直安慰自己莺掠,他們只是感情好衫嵌,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著彻秆,像睡著了一般楔绞。 火紅的嫁衣襯著肌膚如雪结闸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天酒朵,我揣著相機與錄音桦锄,去河邊找鬼。 笑死蔫耽,一個胖子當著我的面吹牛结耀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匙铡,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饼记,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了慰枕?” 一聲冷哼從身側(cè)響起具则,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎具帮,沒想到半個月后博肋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蜂厅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年匪凡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掘猿。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡病游,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稠通,到底是詐尸還是另有隱情衬衬,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布改橘,位于F島的核電站滋尉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏飞主。R本人自食惡果不足惜狮惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碌识。 院中可真熱鬧碾篡,春花似錦、人聲如沸筏餐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胖烛。三九已至眼姐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佩番,已是汗流浹背众旗。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趟畏,地道東北人贡歧。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像赋秀,于是被迫代替她去往敵國和親利朵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354