Object.assign()和展开运算符...的区别

2,229 阅读3分钟

数组

使用object.assign

  1. Object.assign([], a, b)
let a = [1,2]
let b = [3,4]
let c = Object.assign([], a, b)
console.log() a[1] = 6 b[1] = 6 c[1] = 5
a [1, 2] [1, 6] [1, 2] [1, 2]
b [3, 4] [3, 4] [3, 6] [3, 4]
c [3, 4] [3, 4] [3, 4] [3, 5]

a的值被覆盖,分别改变a, b, c的值不会对其他值产生影响

2.Object.assign(a, b)

let a = [1,2]
let b = [3,4]
let c = Object.assign(a, b)
console.log() a[1] = 6 b[1] = 6 c[1] = 5
a [3, 4] [3, 6] [3, 4] [3, 5]
b [3, 4] [3, 4] [3, 6] [3, 4]
c [3, 4] [3, 6] [3, 4] [3, 5]

a的值被覆盖,改变a的值会同步影响c的值,改变b的值对a和c无影响,改变c的值会同步影响a的值

使用展开运算符...

  1. [...a, ...b]
let a = [1,2]
let b = [3,4]
let c = [...a, ...b]
console.log() a[1] = 6 b[1] = 6 c[1] = 5
a [1, 2] [1, 6] [1, 2] [1, 2]
b [3, 4] [3, 4] [3, 6] [3, 4]
c [1, 2, 3, 4] [1, 2, 3, 4] [1, 2, 3, 4] [1, 5, 3, 4]

a的值不会被覆盖,分别改变a, b, c的值不会对其他值产生影响

  1. [...[],...a, ...b]
let a = [1,2]
let b = [3,4]
let c = [...[],...a, ...b]
console.log() a[1] = 6 b[1] = 6 c[1] = 5
a [1, 2] [1, 6] [1, 2] [1, 2]
b [3, 4] [3, 4] [3, 6] [3, 4]
c [1, 2, 3, 4] [1, 2, 3, 4] [1, 2, 3, 4] [1, 5, 3, 4]

a的值不会被覆盖,分别改变a, b, c的值不会对其他值产生影响

对象

使用Object.assign

  1. Object.assign({}, a, b)
let a = { 1: 'aa', 2: 'bb' }
let b = { 1: 'cc', 4: 'dd' }
let c = Object.assign({}, a, b)
console.log() a[1] = 'aaa' b[1] = 'ccc' c[1] = 'ccc'
a {1: "aa", 2: "bb"} {1: "aaa", 2: "bb"} {1: "aa", 2: "bb"} {1: "aa", 2: "bb"}
b {1: "cc", 4: "dd"} {1: "cc", 4: "dd"} {1: "ccc", 4: "dd"} {1: "cc", 4: "dd"}
c {1: "cc", 2: "bb", 4: "dd"} {1: "cc", 2: "bb", 4: "dd"} {1: "cc", 2: "bb", 4: "dd"} {1: "ccc", 2: "bb", 4: "dd"}

1.合并a,b到c时,key相同的属性会合并,且后面元素覆盖前面元素
2.分别改变a,b,c的值不会影响其他元素的值

  1. Object.assign(a, b)
let a = { 1: 'aa', 2: 'bb' }
let b = { 1: 'cc', 4: 'dd' }
let c = Object.assign(a, b)
console.log() a[1] = 'aaa' b[1] = 'ccc' c[1] = 'ccc'
a {1: "cc", 2: "bb", 4: "dd"} {1: "aaa", 2: "bb", 4: "dd"} {1: "cc", 2: "bb", 4: "dd"} {1: "ccc", 2: "bb", 4: "dd"}
b {1: "cc", 4: "dd"} {1: "cc", 4: "dd"} {1: "ccc", 4: "dd"} {1: "cc", 4: "dd"}
c {1: "cc", 2: "bb", 4: "dd"} {1: "aaa", 2: "bb", 4: "dd"} {1: "cc", 2: "bb", 4: "dd"} {1: "ccc", 2: "bb", 4: "dd"}

1.合并a,b到c时,a的值同步变成c的值
2.改变a的值会同步影响c的值,改变c的值也会同步影响a的值,改变b的值对a,c的值无影响

使用展开运算符...

1.{...a, ...b}

let a = { 1: 'aa', 2: 'bb' }
let b = { 1: 'cc', 4: 'dd' }
let c = {...a, ...b}
console.log() a[1] = 'aaa' b[1] = 'ccc' c[1] = 'ccc'
a {1: "aa", 2: "bb"} {1: "aaa", 2: "bb"} {1: "aa", 2: "bb"} {1: "aa", 2: "bb"}
b {1: "cc", 4: "dd"} {1: "cc", 4: "dd"} {1: "ccc", 4: "dd"} {1: "cc", 4: "dd"}
c {1: "cc", 2: "bb", 4: "dd"} 1: "cc", 2: "bb", 4: "dd"} {1: "cc", 2: "bb", 4: "dd"} {1: "ccc", 2: "bb", 4: "dd"}

1.合并a,b到c时,key相同的属性会合并,且后面元素覆盖前面元素
2.分别改变a,b,c的值不会影响其他元素的值

  1. {...{}, ...a, ...b}
let a = { 1: 'aa', 2: 'bb' }
let b = { 1: 'cc', 4: 'dd' }
let c = {...{}, ...a, ...b}
console.log() a[1] = 'aaa' b[1] = 'ccc' c[1] = 'ccc'
a {1: "aa", 2: "bb"} {1: "aaa", 2: "bb"} {1: "aa", 2: "bb"} {1: "aa", 2: "bb"}
b {1: "cc", 4: "dd"} {1: "cc", 4: "dd"} {1: "ccc", 4: "dd"} {1: "cc", 4: "dd"}
c {1: "cc", 2: "bb", 4: "dd"} {1: "cc", 2: "bb", 4: "dd"} {1: "cc", 2: "bb", 4: "dd"} {1: "ccc", 2: "bb", 4: "dd"}

1.合并a,b到c时,key相同的属性会合并,且后面元素覆盖前面元素
2.分别改变a,b,c的值不会影响其他元素的值