剩余部分&擴(kuò)散特性- 讀es2018-2019

前言

ES提案中的Rest/Spread Properties

  • 剩余部分操作符(...)谷饿,僅用于數(shù)據(jù)解構(gòu)和函數(shù)參數(shù)定義
  • 擴(kuò)散操作符(...),僅用于數(shù)組字面量和函數(shù)以及方法調(diào)用的時(shí)候

對(duì)象解構(gòu)中的剩余操作符

可以這么用了

const obj = {foo: 1, bar: 2, baz: 3};
const {foo, ...rest} = obj;
    // Same as:
    // const foo = 1;
    // const rest = {bar: 2, baz: 3};

也可以這么用了

function func({param1, param2, ...rest}) { // rest operator
    console.log('All parameters: ',
        {param1, param2, ...rest}); // spread operator
    return param1 + param2;
}

感覺叼叼的

語(yǔ)法限制

對(duì)象中每一層級(jí)(...)操作符只能用一次专挪,并且只能放在最后

const {...rest, foo} = obj; // SyntaxError
const {foo, ...rest1, ...rest2} = obj; // SyntaxError

你可以這樣用:

const obj = {
    foo: {
        a: 1,
        b: 2,
        c: 3,
    },
    bar: 4,
    baz: 5,
};
const {foo: {a, ...rest1}, ...rest2} = obj;
// Same as:
// const a = 1;
// const rest1 = {b: 2, c: 3};
// const rest2 = {bar: 4, baz: 5};

對(duì)象字面量中的擴(kuò)散操作符

在對(duì)象字面量中,可以通過...將A對(duì)象的所有可以枚舉的屬性插入到B對(duì)象中

const A= {foo: 1, bar: 2, baz: 3};
const B = {...obj, qux: 4}
// B: { foo: 1, bar: 2, baz: 3, qux: 4 }

需要注意的是如果屬性名正好相同的話片排,是會(huì)相互覆蓋的寨腔,覆蓋的結(jié)果取決于變量的順序。

const obj = {foo: 1, bar: 2, baz: 3};
{...obj, foo: true}
//{ foo: true, bar: 2, baz: 3 }
{foo: true, ...obj}
//{ foo: 1, bar: 2, baz: 3 }

使用場(chǎng)景及注意事項(xiàng)

克隆對(duì)象

只會(huì)克隆其可枚舉的屬性率寡,不會(huì)克隆其原型指向迫卢,這個(gè)跟Object.assign很像
如果想克隆其原型,在瀏覽器中可以使用如下的方法

const clone1 = {__proto__: Object.getPrototypeOf(obj), ...obj};
const clone2 = Object.assign(
    Object.create(Object.getPrototypeOf(obj)), obj);

整體克隆

有的場(chǎng)景下冶共,你需要拷貝對(duì)象的所有屬性:包括writable,enumerable,getters,setters等等乾蛤,這個(gè)時(shí)候Object.assign()和...操作符都沒有無(wú)能為力,可以使用

const clone1 = Object.defineProperties({},
    Object.getOwnPropertyDescriptors(obj));

如果還想保留克隆對(duì)象的原型的話比默,可以使用Object.create()

const clone2 = Object.create(
    Object.getPrototypeOf(obj),
    Object.getOwnPropertyDescriptors(obj));

淺拷貝

這些克隆操作都是淺拷貝幻捏,需要注意避免可能造成的問題

其他用途

合并對(duì)象

const merged = {...obj1, ...obj2};  const merged = Object.assign({}, obj1, obj2);

附加默認(rèn)值

const DEFAULTS = {foo: 'a', bar: 'b'};  
const userData = {foo: 1};  
const data = {...DEFAULTS, ...userData};
const data = Object.assign({}, DEFAULTS, userData);

制定個(gè)別鍵的默認(rèn)值

const userData = {foo: 1}; 
const data = {foo: 'a', bar: 'b', ...userData};  
const data = Object.assign({}, {foo:'a', bar:'b'}, userData);  // {foo: 1, bar: 'b'}

擴(kuò)散操作符和Object.assign()的異同

兩種使用Object.assign()的方式

Object.assign(target, source1, source2);

這個(gè)情況下盆犁,target被改變了

const result = Object.assign({}, source1, source2);

這個(gè)情況下命咐,沒有對(duì)現(xiàn)存的對(duì)象做任何改變

共同點(diǎn)

擴(kuò)散操作符和Object.assign()都是使用get操作去讀取value的

擴(kuò)散操作符和Object.assign()都只能獲取枚舉屬性

不同點(diǎn)

擴(kuò)散操作符定義了屬性,Object.assign()設(shè)置了屬性

擴(kuò)散操作符在目標(biāo)對(duì)象定義了新的屬性谐岁,Object.assign()是通過set操作穿件了屬性醋奠,有兩種結(jié)果:

第一: Object.assign()會(huì)觸發(fā)setters

Object.defineProperty(Object.prototype, 'foo', {
    set(value) {
        console.log('SET', value);
    },
});
const obj = {foo: 123};

Object.assign({}, obj)
//SET 123
//{}

{ ...obj }
//{ foo: 123 }

第二: 如果目標(biāo)對(duì)象設(shè)置了只讀屬性榛臼,Object.assign()會(huì)繼承只讀屬性,擴(kuò)散操作符不會(huì)

Object.defineProperty(Object.prototype, 'bar', {
    writable: false,
    value: 'abc',
});
const tmp = {};
tmp.bar = 123;
// 在嚴(yán)格模式下報(bào)錯(cuò):TypeError: Cannot assign to read only property 'bar'
// 在非嚴(yán)格模式下只是忽略窜司,不報(bào)錯(cuò)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沛善,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子塞祈,更是在濱河造成了極大的恐慌金刁,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件议薪,死亡現(xiàn)場(chǎng)離奇詭異尤蛮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)斯议,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門产捞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哼御,你說我怎么就攤上這事坯临。” “怎么了恋昼?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵看靠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我液肌,道長(zhǎng)衷笋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任矩屁,我火速辦了婚禮辟宗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吝秕。我一直安慰自己泊脐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布烁峭。 她就那樣靜靜地躺著容客,像睡著了一般。 火紅的嫁衣襯著肌膚如雪约郁。 梳的紋絲不亂的頭發(fā)上缩挑,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音鬓梅,去河邊找鬼供置。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绽快,可吹牛的內(nèi)容都是我干的芥丧。 我是一名探鬼主播紧阔,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼续担!你這毒婦竟也來了擅耽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤物遇,失蹤者是張志新(化名)和其女友劉穎乖仇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體询兴,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡这敬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蕉朵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崔涂。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖始衅,靈堂內(nèi)的尸體忽然破棺而出冷蚂,到底是詐尸還是另有隱情,我是刑警寧澤汛闸,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布蝙茶,位于F島的核電站,受9級(jí)特大地震影響诸老,放射性物質(zhì)發(fā)生泄漏隆夯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一别伏、第九天 我趴在偏房一處隱蔽的房頂上張望蹄衷。 院中可真熱鬧,春花似錦厘肮、人聲如沸愧口。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)耍属。三九已至,卻和暖如春巩检,著一層夾襖步出監(jiān)牢的瞬間厚骗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工兢哭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留领舰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像提揍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子煮仇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 屬性的簡(jiǎn)潔表示法 ES6允許直接寫入變量和函數(shù)劳跃,作為對(duì)象的屬性和方法。 上面代碼表明浙垫,ES6允許在對(duì)象之中刨仑,直接寫...
    oWSQo閱讀 509評(píng)論 0 0
  • 1.屬性的簡(jiǎn)潔表示法 允許直接寫入變量和函數(shù) 上面代碼表明,ES6 允許在對(duì)象之中夹姥,直接寫變量杉武。這時(shí),屬性名為變量...
    雨飛飛雨閱讀 1,136評(píng)論 0 3
  • 屬性的簡(jiǎn)潔表示法 ES6允許直接寫入變量和函數(shù)辙售,作為對(duì)象的屬性和方法轻抱。這樣的書寫更加簡(jiǎn)潔。 上面代碼表明旦部,ES6允...
    呼呼哥閱讀 2,923評(píng)論 0 2
  • 2017.04.10 姓名:王方河 公司:寧波大發(fā)化纖有限公司 寧波盛和塾《六項(xiàng)精進(jìn)》235期學(xué)員祈搜。 【日精進(jìn)打卡...
    北轅南轍閱讀 185評(píng)論 0 0
  • <你想不想要一個(gè)人生的作弊器?>這篇文章打磨的概念是學(xué)習(xí)能力士八,一個(gè)人的學(xué)習(xí)能力有強(qiáng)有弱容燕,同樣的知識(shí)可能會(huì)有不一樣的...
    文所聞閱讀 235評(píng)論 0 0