浅拷贝的四种方式:
深拷贝:
JS实现深拷贝 https://www.cnblogs.com/dobeco/p/11295316.html
一、赋值、浅拷贝与深拷贝的区别
二、深拷贝的方法
1.JSON转换
var targetObj = JSON.parse(JSON.stringify(copyObj))
let arr4 = JSON.parse(JSON.stringify(arr))
缺点:
(1)如果对象里有函数,函数无法被拷贝下来
(2)无法拷贝copyObj对象原型链上的属性和方法
(3)当数据的层次很深,会栈溢出
2.普通递归函数
function deepCopy( source ) {
if (!isObject(source)) return source; //如果不是对象的话直接返回
let target = Array.isArray( source ) ? [] : {} //数组兼容
for ( var k in source ) {
if (source.hasOwnProperty(k)) {
if ( typeof source[ k ] === 'object' ) {
target[ k ] = deepCopy( source[ k ] )
} else {
target[ k ] = source[ k ]
}
}
}
return target
}
function isObject(obj) {
return typeof obj === 'object' && obj !== null
}
缺点:
(1)无法保持引用
(2)当数据的层次很深,会栈溢出
3.防栈溢出函数
function cloneLoop(x) {
const root = {};
// 栈
const loopList = [
{
parent: root,
key: undefined,
data: x,
}
];
while(loopList.length) {
// 深度优先
const node = loopList.pop();
const parent = node.parent;
const key = node.key;
const data = node.data;
// 初始化赋值目标,key为undefined则拷贝到父元素,否则拷贝到子元素
let res = parent;
if (typeof key !== 'undefined') {
res = parent[key] = {};
}
for(let k in data) {
if (data.hasOwnProperty(k)) {
if (typeof data[k] === 'object') {
// 下一次循环
loopList.push({
parent: res,
key: k,
data: data[k],
});
} else {
res[k] = data[k];
}
}
}
}
return root;
}
优点:
(1)不会栈溢出
(2)支持很多层级的数据
function copyObject(orig) {
var copy = Object.create(Object.getPrototypeOf(orig));
copyOwnPropertiesFrom(copy, orig);
return copy;
}
function copyOwnPropertiesFrom(target, source) {
Object
.getOwnPropertyNames(source)
.forEach(function (propKey) {
var desc = Object.getOwnPropertyDescriptor(source, propKey);
Object.defineProperty(target, propKey, desc);
});
return target;
}
var obj = {
name: 'Jack',
age: '32',
job: 'developer'
};
var obj2 = copyObject(obj);
console.log(obj2);
obj.age = 39;
obj.name = 'Tom';
console.log(obj);
console.log(obj2);
EJB>自定义安全域 小强斋
EJB>定时服务(Timer Service) 小强斋
EJB>依赖注入(dependency injection) 小强斋
EJB>定时服务(Timer Service) 小强斋
EJB>安全服务的具体开发 小强斋
EJB>JMS(Java Message Service)和消息驱动bean 小强斋
EJB>拦截器(Interceptor) 小强斋
《做最好的员工》第二章:好员工擅长合作
教你29招,让你在社交,职场上人人对你刮目相看 !
- 最新文章
-
TSINGSEE青犀视频云边端协同架构开发qt+ffmpeg实现视频拉流报错“程序结束异常”,如何处理?
H.265编码安防视频播放器EasyPlayerRTSPWIN版编译C#DEMO如何更换授权?
TSINGSEE青犀视频云边端架构视频流传输平台中RTSP、RTCP、RTP三种协议有什么区别?
TSINGSEE青犀视频云边端架构视频平台,加密机授权如何配置成固定ip?
【硬件设备】TSINGSEE青犀视频+海康合作研发高清RTMP推流摄像机常见问题解答
详解TSINGSEE青犀视频云边端架构产品rtmp和http方式在播放flv时的特点
WPF 自定义控件操作自定义控件
WPF 根据绑定值调用不同的样式
TraceRoute(tracert)实现原理
STL中的模板类map的简单例子
Copyright © 2011-2022 走看看