ES2018 爲對象解構提供 rest 參數和spread擴展運算符。數組
1. 合併倆對象:spa
let obj = {a:1,b:2}, obj2={} let obj3 = {...obj, ...obj2} console.log(obj3) // {a: 1, b: 2}
2. 對象的值若是是undefined 或者 nullprototype
let obj1 = {a: 1, b: 2}, obj2={c: undefined, d: null} console.log({...obj1, ...obj2}) //{a: 1, b: 2, c: undefined, d: null}
3. 對象的屬性是不可枚舉的:rest
let obj1 = Object.defineProperty({}, 'f', {value: 1}) //defineProperty 枚舉屬性默認爲false let obj2 = {g: 2} console.log({...obj1, ...obj2})// {g: 2} 不復制不可枚舉的屬性 console.log(Object.assign(obj1, obj2)) //{g: 2, f: 1}
題外話:如何判斷一個對象的某個屬性是否可枚舉...啊,仍是甩連接吧...code
4. spread 是淺拷貝:這意味着在多維數組、嵌套對象中會出問題:對象
//先看數組: 官網的例子 var a = [[1], [2], [3]]; var b = [...a]; b.shift().shift() console.log(a) //[[], [2], [3]] console.log(b) //[[2], [3]] //再看對象: let o1 = {a:{aa: 1}, b:{bb: 2}} let o2 = {...o1} o2.a.aa=3 console.log(o2) // {a: {aa: 3}, b: {bb: 2}} console.log(o1) // {a: {aa: 3}, b: {bb: 2}} 克隆對象o2的a屬性值,指向o1.a。
o2.b = 4
console.log(o2) // {a: {aa: 3}, b: 4}
console.log(o1) // {a: {aa: 3}, b: {bb: 2}}
let obj2 = {g: 2} let obj3 = {...obj2} obj3.g = 4 console.log(obj2) //{g: 2}
然而這跟 prototype 有啥關係。。。blog
領導說過七夕有約會的能夠走了,沒約會的能夠跟他們去吃飯而後回來繼續上班...我沒約會我也要選擇先走了,下班...ip