Search K
Appearance
👍欢迎大家积极投稿交流👍
如果文档内容陈旧或者链接失效,请发现后及时同步,我将尽快修改
👇微信👇

Appearance
对象类型在赋值的过程中其实是复制了地址,从而会导致改变了一方其他也都被改变的情况,解决这种问题的方法就是利用深/浅拷贝
针对对象拷贝的场景,只拷贝了第一层,深层次(大于一层)只能拷贝到对象的引用
即深层次的对象发生了变动,会影响原来的对象与被拷贝出来的新对象
/**
* 浅拷贝
* @param {object} obj
*/
function shallowCopy(obj) {
// ...省略实现
}
const a = {
name: 'xm',
info: {
age: 18,
},
}
const a1 = shallowCopy(a)
a1.name = 'a1'
a1.info.age = 20
console.log(a1.name === a.name) // false
console.log(a1.info.age === a.info.age) // true浅拷贝只解决了第一层的问题,如果接下去的值中还有对象的话,拷贝的仍是引用
在大多数情况下,我们的对象的层级都是超过一层的
let a = { name: 'xm' }
let a1 = Object.assign({}, a)
a.name = 'a1'
console.log(a1.name === a.name) // falselet a = { name: 'xm' }
let a1 = { ...a }
a.name = 'a1'
console.log(a1.name === a.name) // false针对数组还有
let arr = [1, 2, { name: 'xm' }]
let arr1 = Array.prototype.slice.call(arr)let arr = [1, 2, { name: 'xm' }]
let arr1 = Array.prototype.concat.call(arr)能应付大多数业务场景
局限:
function deepClone1(obj) {
return new Promise((resolve) => {
let { port1, port2 } = new MessageChannel()
port2.onmessage = (ev) => {
resolve(ev.data)
}
port1.postMessage(obj)
})
}
;(async function () {
let a = { a: 1, b: undefined, c: { d: 1 } }
// 添加循环引用
a.c.d = a.c
let b = await deepClone1(a)
console.log(b)
})()