keywords:JS 深拷贝
深拷贝:针对【引用】类型,传递的是地址,多变量同时指向同一块内存地址(比如某个对象)
let obj1={
//1.不需要处理
//基本数据类型可以不做处理,typeof !== 'object'
num:12,
str:'xxx',
bol:false,
//函数的处理一般只是功能的复用
fn:function(){ console.log(6) },
//也不需要处理
nulVal:null
//2.需要处理
//无元素,可以直接通过构造函数new出来的新数据
date:new Date(),
reg:/7/,
//3.新结构
map:new Map([['d',8],['e',9]]),
set:new Set([10,11]),
//4.key和value
array:[1,2],
arrayObj:[{a:3,b:4}],
obj:{c:5},
}
//let cloned=obj1
//把一个对象先从一个JS变量变成字符串,在把字符串变成js变量
//let cloned=JSON.parse(JSON.stringify(obj1));
function deepClone(obj){
//1.不处理
if(typeof(obj)!=='object' || !obj) return obj;
let tmp,params
//2.无元素
if(obj instanceof RegExp || obj instanceof Date){
//new RegExp()
//new Date()
params=obj
//let constructor=obj.constructor
//new constructor(obj);
}
tmp=new constructor(params)
//3.新结构
//new Set()
//new Map()
if(obj instanceof Map){
for(let [key,value] of obj){
tmp.set(deepClone(key),deepClone(value));
}
}else if(obj instanceof Set){
for(let value of obj){
tmp.add(deepClone(value));
}
}else{//4.key val
for(let key in obj){
tmp[key]=deepClone(obj[key])
}
}
//4.key Val
//new Array()
//new Object()
if(obj instanceof Array || Object.prototype.toString.call(obj)==='[object object]'){
for(let key in obj){
tmp[key]=deepClone(obj[key])
}
}
return
}
标签:tmp,面试题,obj,前端,js,deepClone,let,key,new
From: https://www.cnblogs.com/whitebuless/p/17102785.html