js数据类型-深拷贝与浅拷贝

概括

浅拷贝

let obj1 = { a: 0, b: { c: "hello" } }
let obj2 = Object.assign({}, obj1)

obj1.a = 1 
obj1.d = '2'
obj1.b.c = '你好'
console.log(obj1); //  { a: 1, b: { c: '你好' }, d: 2 }
console.log(obj2); // { a: 0, b: { c: '你好' } }
const arr = ['a', 'b', 'c']
const arr1 = arr.slice(0)
arr[1] = 'd'
console.log(arr) // ['a', 'd', 'c']
console.log(arr1) // ['a', 'b', 'c']
const arr = ['a', 'b', {a: 'd'}]
const arr1 = arr.concat()
arr1[2].a = '1'
console.log(arr) // ['a', 'b', {a:''1'}]
console.log(arr1) // ['a', 'b', , {a:''1'}]
//与concat方法差不多 这个还好读
const arr = ['a', 'b', {a: 'd'}]
const arr1 = [...arr]
arr1[2]['b'] = 'b'
arr1[0] = '1'
console.log(arr) //['a', 'b', {a:''d', 'b': 'b'}]
console.log(arr1) //['1', 'b', {a:''d', 'b': 'b'}]
const obj = {a: '1', d: [0]}
const obj2 = {...obj}
obj.c = 'a'
obj.d[0] = '1'
console.log(obj) // {a: '1', c: 'a', d: ['1']}
console.log(obj2) // {a: '1', d: ['1']}

深拷贝

function deepClone(obj) {
	if(obj == null || typeof obj != 'object') {
		return obj
	}
	if(Object.prototype.toString.call(obj) == '[object Date]') {
		return new Date(obj)
	}
	if(Object.prototype.toString.call(obj) == '[object RegExp]') {
		return new RegExp(obj)
	}
	if(Object.prototype.toString.call(obj) == '[object Undefined]') {
		return new Error(obj)
	}
	let objClone = Array.isArray(obj) ? [] : {}
	if(obj && typeof obj == 'object') {
		for(let k in obj) {
			if(obj.hasOwnProperty(k)) {
				if(typeof obj[k] == 'object') {
					objClone[k] = deepClone(obj[k])
				} else {
					objClone[k] = obj[k]
				}
			}
		}
	}
	return objClone 
}
const $ = require('jquery')
const obj = {
	a: '1',
	b: '2',
	c: {
		name: 'a'
	}
}
const obj2 = $.extend(true, {}, obj)
console.log(obj.c === obj2.c) //false
const _ = require('lodash')
const obj = {
	a: '1',
	b: '2',
	c: {
		name: 'a'
	},
	
}
const obj1 = _.cloneDeep(obj)
obj1.c.name = 'b'
console.log(obj) // {a: '1', b: '2', c: {name: 'a'}}
console.log(obj1) // {a: '1', b: '2', c: {name: 'b'}}
const obj = {
	a: '1',
	b: '2',
	c: {
		name: 'a'
	}
}
const obj2 = JSON.parse(JSON.stringify((obj)))
console.log(obj.c === obj2.c) //false
  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值