拷贝 = 复制
内容(javascript
对象)
// 如:
let obj1 = {
name:"jack",
age:18,
fun:{
swimimg:'游泳'
}
}
// 新对象
let obj2 = {
name:"jack",
age:18,
fun:{
swimimg:'游泳'
}
}
浅拷贝(只拷贝一层对象) 深拷贝(可以拷贝嵌套对象)
<script>
// 要拷贝的对象
let obj = {
name:"jack",
age:18
}
let newObj = obj
consol.log("newObj",newObj ) // newObj:{name:"jack",age:18}
</script>
Function函数
和值是undefind的属性
<script>
// 要拷贝的对象
let obj = {
name:"jack",
age:18,
say:function(){ // 该方法不能拷贝函数
consol.log("say>>>>>")
},
null:undefind, // 该方法不能拷贝值为undefind的属性
fun:{
swimming:"游泳"
}
}
/*
* 实现方式:JSON.parse(JSON.stringify(obj))
*/
// 拷贝obj对象
let newObj = JSON.parse(JSON.stringify(obj))
consol.log("拷贝后的对象newObj",newObj ) // newObj:{name:"jack",age:18,fun{swimming:"游泳"}}
</script>
function和
值是undefind的属性
// 要拷贝的对象
let obj = {
name:"jack",
age:18,
say:function(){
consol.log("say>>>>>")
},
null:undefind,
fun:{ // 不能拷贝嵌套对象
swimming:"游泳"
}
}
/*
* 实现方式:{...obj}
*/
// 拷贝obj对象
let newObj = {...obj}
consol.log("拷贝后的对象newObj",newObj ) // newObj:{name:"jack",age:18,say:function(){ consol.log("say>>>>>")}, null:undefind}
</script>
<script>
// 深拷贝 递归实现
const cloneDeep = data => {
const newData = Array.isArray(data) ? [] : {}
for (let key in data) {
if(data[key] && typeof data[key] === 'object') {
nawData[key] = cloneDeep(data[key])
} else {
newData[key] = data[key]
}
}
return newData
}
</script>
object.prototype.toString.coll(num)
[object String] [object Object ] [object Array] [object Function]
// 判断对象属性值是否有对象,就是对象是否有嵌套对象
const isObjectValue = data => {
for (let key in data) {
if(data[key] && typeof data[key] === 'object') {
if(object.prototype.toString.call(data[key]) !== '[object function]'){
return true
}
}
}
}
// 递归判断数据类型
const isFunctionUndefined = data=> {
for (let key in data) {
if(data[key] === undefined) {
return true
} else if (data[key] && object.prototype.toString.coll(data[key]) === '[object Function]'){
return true // Function
} else if (data[key] && typeof data[key] === 'object') {
isFunctionUndefined(data[key])
}
}
}
// 使用递归方法拷贝对象
const cloneDeepObj = obj => {
if(obj === undefined) {
throm new TypeError('param is not undefined')
}
// 判断拷贝对象只有一层及属性值都不是对象,使用Object.assign() === 扩展运输符[...]
if(!isObjectValue(obj)) {
return {...obj}
}
// 判断类型,如果不是Function或undefined使用JSON方式
if(!isFunctionUndefined(obj)) {
return JSON.parse(JSON.stringify(obj))
}
return cloneDeep(obj)
}