一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語(yǔ)言 - JavaScript - 詳解ES6 擴(kuò)展運(yùn)算符的使用與注意事項(xiàng)

詳解ES6 擴(kuò)展運(yùn)算符的使用與注意事項(xiàng)

2021-11-16 16:36Clloz JavaScript

擴(kuò)展運(yùn)算符 (spread syntax) 是 ES6 提供的一種非常便捷的新語(yǔ)法,給我們操作數(shù)組和對(duì)象帶來(lái)了非常大的便利,我在很多文章中也提到了這個(gè)語(yǔ)法。但是其實(shí)擴(kuò)展運(yùn)算符的用法還是比較多比較雜的,我用一篇文章來(lái)做一下總結(jié),梳理一

擴(kuò)展運(yùn)算符 spread syntax 又叫展開(kāi)語(yǔ)法,寫(xiě)法是 ...,顧名思義,其實(shí)是用來(lái)展開(kāi)字符串,數(shù)組和對(duì)象的一種語(yǔ)法,可以在函數(shù)調(diào)用/數(shù)組構(gòu)造時(shí), 將數(shù)組表達(dá)式或者 string 在語(yǔ)法層面展開(kāi);還可以在構(gòu)造字面量對(duì)象時(shí), 將對(duì)象表達(dá)式按 key-value 的方式展開(kāi)。常用的語(yǔ)法如下:

?
1
2
3
4
5
6
7
8
//函數(shù)調(diào)用:
myFunction(...iterableObj);
 
//字面量數(shù)組構(gòu)造或字符串:
[...iterableObj, '4', ...'hello', 6];
 
// 構(gòu)造字面量對(duì)象時(shí),進(jìn)行克隆或者屬性拷貝(ECMAScript 2018規(guī)范新增特性):
let objClone = { ...obj };

在函數(shù)調(diào)用時(shí)使用擴(kuò)展運(yùn)算符相當(dāng)于使用 Function.prototype.apply

?
1
2
3
4
5
6
7
8
function myFunction(x, y, z) { }
var args = [0, 1, 2];
myFunction(...args);
 
//相當(dāng)于
function myFunction(x, y, z) {}
var args = [0, 1, 2];
myFunction.apply(null, args);

apply 不同的是,我們不僅可以將全部參數(shù)放到一個(gè)數(shù)組中,還可以只將其中幾個(gè)參數(shù)用擴(kuò)展運(yùn)算符展開(kāi),并且可以再一次調(diào)用中多次使用擴(kuò)展運(yùn)算符。

?
1
2
3
4
5
6
function myFunction(a, b, c, d, e) {
  console.log(a, b, c, d, e); //-1 0 1 2 3
  console.log(arguments); //[Arguments] { '0': -1, '1': 0, '2': 1, '3': 2, '4': 3 }
}
var args = [0, 1];
myFunction(-1, ...args, 2, ...[3]);

使用 new 關(guān)鍵字來(lái)調(diào)用構(gòu)造函數(shù)時(shí),不能直接使用數(shù)組加上 apply 的方式(apply 執(zhí)行的是調(diào)用 [[Call]] , 而不是構(gòu)造 [[Construct]])。有了展開(kāi)語(yǔ)法, 將數(shù)組展開(kāi)為構(gòu)造函數(shù)的參數(shù)就很簡(jiǎn)單了:

?
1
2
var dateFields = [1970, 0, 1]; // 1970年1月1日
var d = new Date(...dateFields);

如果想要不使用擴(kuò)展運(yùn)算符實(shí)現(xiàn)同樣的效果,我們必須用一個(gè)函數(shù)包裝構(gòu)造函數(shù),將這個(gè)新的構(gòu)造函數(shù)的 prototype 設(shè)為原構(gòu)造函數(shù)的實(shí)例,用 Object.create(constructor.prototype)(這里主要是為了新構(gòu)造函數(shù)原型的修改不影響原構(gòu)造函數(shù)的原型,直接用 constructor.prototype 作為新構(gòu)造函數(shù)的原型也可以實(shí)現(xiàn))。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function applyAndNew(constructor, args) {
  function partial() {
    return constructor.apply(this, args);
  }
  if (typeof constructor.prototype === 'object') {
    partial.prototype = Object.create(constructor.prototype);
  }
  return partial;
}
 
function myConstructor() {
  console.log('arguments.length: ' + arguments.length);
  console.log(arguments);
  this.prop1 = 'val1';
  this.prop2 = 'val2';
}
 
var myArguments = ['hi', 'how', 'are', 'you', 'mr', null];
var myConstructorWithArguments = applyAndNew(myConstructor, myArguments);
 
console.log(new myConstructorWithArguments());
// (myConstructor構(gòu)造函數(shù)中):      arguments.length: 6
// (myConstructor構(gòu)造函數(shù)中):      ["hi", "how", "are", "you", "mr", null]
// ("new myConstructorWithArguments"中): {prop1: "val1", prop2: "val2"}

當(dāng)然用的最多的還是在字面量數(shù)組上,沒(méi)有展開(kāi)語(yǔ)法的時(shí)候,只能組合使用 push, splice, concat 等方法,來(lái)將已有數(shù)組元素變成新數(shù)組的一部分。有了展開(kāi)語(yǔ)法, 通過(guò)字面量方式, 構(gòu)造新數(shù)組會(huì)變得更簡(jiǎn)單、更優(yōu)雅:

?
1
2
3
var parts = ['shoulders', 'knees'];
var lyrics = ['head', ...parts, 'and', 'toes'];
// ["head", "shoulders", "knees", "and", "toes"]

可以用來(lái)實(shí)現(xiàn)數(shù)組淺拷貝:

?
1
2
3
4
5
6
var arr = [1, 2, 3];
var arr2 = [...arr]; // like arr.slice()
arr2.push(4);
 
// arr2 此時(shí)變成 [1, 2, 3, 4]
// arr 不受影響

連接多個(gè)數(shù)組:

?
1
2
3
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
var arr3 = [...arr1, ...arr2];

擴(kuò)展運(yùn)算符還可以將已有對(duì)象的所有可枚舉(enumerable)屬性拷貝到新構(gòu)造的對(duì)象中。該方法為淺拷貝,可以拷貝 Symbol 屬性,但不包含原型上的屬性和方法。如果同時(shí)拷貝多個(gè)對(duì)象,后面的對(duì)象會(huì)覆蓋前面對(duì)象的同名屬性。

?
1
2
3
4
5
6
7
8
var obj1 = { foo: 'bar', x: 42, [Symbol('a')]: 123 };
var obj2 = { foo: 'baz', x: 100, y: 13 };
 
var clonedObj = { ...obj1 };
console.log(clonedObj); //{ foo: 'bar', x: 42, [Symbol(a)]: 123 }
 
var mergedObj = { ...obj1, ...obj2 };
console.log(mergedObj); //{ foo: 'baz', x: 100, y: 13, [Symbol(a)]: 123 }

該方法的性質(zhì)和 Object.assign 類似,但是 Object.assign() 函數(shù)會(huì)觸發(fā) setters,而展開(kāi)語(yǔ)法則不會(huì)。

注意事項(xiàng)

  1. 在數(shù)組或函數(shù)參數(shù)中使用展開(kāi)語(yǔ)法時(shí), 擴(kuò)展運(yùn)算符只能用于可迭代對(duì)象。
  2. 只有函數(shù)調(diào)用時(shí),擴(kuò)展運(yùn)算符才可以放在圓括號(hào)中,否則會(huì)報(bào)錯(cuò)。
  3. 只能用在函數(shù)調(diào)用,字面量數(shù)組(可以在數(shù)組中展開(kāi)字符串),字面量對(duì)象中。
  4. 用于數(shù)組的解構(gòu)賦值的時(shí)候,擴(kuò)展運(yùn)算符只能處于最后一個(gè)。
  5. 展開(kāi)對(duì)象可以是任意可迭代對(duì)象。

剩余參數(shù)

剩余參數(shù)語(yǔ)法允許我們將一個(gè)不定數(shù)量的參數(shù)表示為一個(gè)數(shù)組。如果函數(shù)的最后一個(gè)命名參數(shù)以 ... 為前綴,則它將成為一個(gè)由剩余參數(shù)組成的真數(shù)組,其中從 0(包括)到 theArgs.length(排除)的元素由傳遞給函數(shù)的實(shí)際參數(shù)提供。

剩余語(yǔ)法(Rest syntax) 看起來(lái)和展開(kāi)語(yǔ)法完全相同,不同點(diǎn)在于, 剩余參數(shù)用于解構(gòu)數(shù)組和對(duì)象。從某種意義上說(shuō),剩余語(yǔ)法與展開(kāi)語(yǔ)法是相反的:展開(kāi)語(yǔ)法將數(shù)組展開(kāi)為其中的各個(gè)元素,而剩余語(yǔ)法則是將多個(gè)元素收集起來(lái)并“凝聚”為單個(gè)元素。擴(kuò)展運(yùn)算符是用在函數(shù)調(diào)用,而剩余參數(shù)是用在函數(shù)聲明。

剩余參數(shù)和 arguments 對(duì)象之間的區(qū)別主要有三個(gè):

  • 剩余參數(shù)只包含那些沒(méi)有對(duì)應(yīng)形參的實(shí)參,而 arguments 對(duì)象包含了傳給函數(shù)的所有實(shí)參。
  • arguments 對(duì)象不是一個(gè)真正的數(shù)組,而剩余參數(shù)是真正的 Array 實(shí)例,也就是說(shuō)你能夠在它上面直接使用所有的數(shù)組方法,比如 sortmapforEach pop
  • arguments 對(duì)象還有一些附加的屬性 (如 callee 屬性)。

如果剩余參數(shù)(包括在解構(gòu)賦值中)右側(cè)有逗號(hào),會(huì)拋出 SyntaxError,因?yàn)槭S嘣乇仨毷呛瘮?shù)的最后一個(gè)參數(shù)或者數(shù)組的最后一個(gè)元素。

以上就是詳解ES6 擴(kuò)展運(yùn)算符的詳細(xì)內(nèi)容,更多關(guān)于ES6 擴(kuò)展運(yùn)算符的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://www.clloz.com/programming/front-end/js/2020/11/05/deep-into-spread-syntax/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本在线亚州精品视频在线 | 99久久www免费 | 国产亚洲一区二区三区 | 青青青青青国产费线在线观看 | 欧美人与牲动交xxx 欧美人妖另类性hd 欧美人人干 | 免费精品99久久国产综合精品 | 深夜激情网站 | 国产午夜精品理论片 | 国产精品一区二区三区免费视频 | jzz大全部 | 久久青草免费91线频观看站街 | 射玉足| 网站久久 | 国产成人免费在线视频 | 国产在线观看福利片 | 欧美日韩一级视频 | 国产精品久久久久久久久99热 | 精品国产品国语在线不卡丶 | jzzjlzz亚洲乱熟在线播放 | 4hu影院在线观看 | 国产一卡二卡3卡4卡四卡在线视频 | 精品区卡一卡2卡三免费 | 国产日韩欧美在线播放 | 99视频有精品视频免费观看 | 天天色综合久久 | 国产午夜免费秋霞影院 | 国产麻豆传媒在线观看 | 韩国漂亮美女三级在线观看 | 牛牛影院成人免费网页 | 91精品国产免费久久 | 星星动漫在线观看无删减 | 99自拍视频在线观看 | 日本视频在线免费看 | 无遮免费网站在线入口 | 大学生按摩黄a级中文片 | 国产日韩欧美色视频色在线观看 | 韩国日本香港毛片免费 | 国产午夜成人无码免费看 | 亚洲精品一线二线三线 | 精品国产一区二区三区国产馆 | 青草午夜精品视频在线观看 |