由 Rest參數 和 Spread擴展運算符想到的...

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

相關文章
相關標籤/搜索