1. 程式人生 > >由 Rest參數 和 Spread擴展運算符想到的...

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

enum ref ons sig 是否 問題 define con 運算

ES2018 為對象解構提供 rest 參數和spread擴展運算符。

1. 合並倆對象:

let obj = {a:1,b:2}, obj2={}
let obj3 = {...obj, ...obj2}
console.log(obj3) // {a: 1, b: 2}

2. 對象的值如果是undefined 或者 null

let obj1 = {a: 1, b: 2}, obj2={c: undefined, d: null}
console.log({...obj1, ...obj2}) //{a: 1, b: 2, c: undefined, d: null}

3. 對象的屬性是不可枚舉的:

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}

題外話:如何判斷一個對象的某個屬性是否可枚舉...啊,還是甩鏈接吧...

屬性的可枚舉性和所有權

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還是說不出個所以然...先這樣..

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