弄了个js详解系列
走过路过,不要错过,反正我看完是对js理解更深入了!
地址:极客教程
目录:
- 详解setTimeout(fn,0)
- 详解JS中的事件机制(带实例)
- 详解CommonJS和AMD/CMD!
- 详解js中对象的深浅拷贝
- 详解变量声明提升和函数声明提升
- 详解懒加载和预加载(js)
- 详解HTML5的WebSocket
- 详解Object.is()与比较操作符===、==
- 详解js中的原型链,prototype与__proto__的关系
欢迎关注,不定期更新。
12 回复
支持下楼主
2.3 使用Object.create()方法
直接使用var newObj = Object.create(oldObj),可以达到深拷贝的效果。
/* ================ 深拷贝 ================ */
function deepClone(initalObj, finalObj) {
var obj = finalObj || {};
for (var i in initalObj) {
var prop = initalObj[i];
// 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
if(prop === obj) {
continue;
}
if (typeof prop === 'object') {
obj[i] = (prop.constructor === Array) ? [] : Object.create(prop);
} else {
obj[i] = prop;
}
}
return obj;
}
这个感觉好像有问题
@jiangli373 好像是有点问题,我看看
obj[i] = (prop.constructor === Array) ? [] : Object.create(prop);
改成
obj[i] = (prop.constructor === Array) ? prop : Object.create(prop);
就可以了,写错了
function deepClone(initalObj, finalObj) {
var obj = finalObj || {};
for (var i in initalObj) {
var prop = initalObj[i];
// 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
if(prop === obj) {
continue;
}
if (typeof prop === 'object') {
obj[i] = (prop.constructor === Array) ? prop : Object.create(prop);
} else {
obj[i] = prop;
}
}
return obj;
}
var obj = {
a:{
'name':'jiang',
'age':30
},
b:[{a:'name'},2,3]
};
var nw = deepClone(obj,{});
console.log(nw) //{ a: {}, b: [ { a: 'name' }, 2, 3 ] }
nw.b[0].b = 'helklo';
console.log(nw) //{ a: {}, b: [ { a: 'name', b: 'helklo' }, 2, 3 ] }
console.log(obj) //{ a: { name: 'jiang', age: 30 },b: [ { a: 'name', b: 'helklo' }, 2, 3 ] }
貌似还是有问题
@jiangli373 ^_^不知道哪里出了问题,应该是数组还要做一层判断
@cllgeek 用Object.create的话 老对象改变会影响新对象
https://github.com/N-ZOO/everycode/issues/1#issuecomment-163324741
@jiangli373 但是你上面的验证中没有改变老对象啊??
@cllgeek 对 我的意思是用Object.create的话 老对象改变会影响新对象 和我上面的那个例子没有关系
mark 有时间学习一下
极客教程是什么
来自酷炫的 CNodeMD
@sc-yuns 我自己的一个项目