浅拷贝的实现


// 浅拷贝函数
var dad = {name:'chen',age:18};
var son = {sex:'男'};
function clone(dad,son){
var son = son || {};//判断s对象是否存在,不存在则定义s为空对象
 for (var prop in dad) {
son[prop] = dad[prop];
};
return son;//返回s对象
}; print(clone(dad,son));

打印结果:

但是假如,对象里面有子对象

var person = {
name: 'chen',
age:18,
man: {
hight:188
}
};

那么在复制时浅拷贝只是将子对象的一个引用地址复制给son对象;son和person里的man 属性都指向同一个对象,故改变任一个都能影响到另外一个:

例子如下:

var dad = {
name:'chen',
age:18,
man: {
hight:188
}
}
var son = {
sex:'男'
};
// 浅拷贝函数
function clone(dad,son){
var son = son|| {}; //判断s对象是否存在,不存在则定义s为空对象
for (var prop in dad){
son[prop]=dad[prop];
};
return son;//返回s对象
}; clone(dad,son); // 进行浅拷贝
son.name='ze';
console.log(son.name);//打印ze
console.log(dad.name);//打印chen
son.man.hight=1999;
console.log(son.man.hight);//打印1999
console.log(dad.man.hight);//打印1999

打印结果:

解决办法: 浅拷贝----->深拷贝

深拷贝可以很好的解决引用类型的拷贝问题,采用递归的方法去复制拷贝对象,从而解决浅拷贝带来的弊端

var dad = {
name:'chen',
age:18,
man: {
hight:188
}
} var son = {
sex:'男'
}; // 深拷贝函数
function clone(dad,son){
   var son = son || {};//判断s对象是否存在,不存在则定义s为空对象
   for (var prop in dad) {
if (typeof dad[prop]=='object') {
//三元运算,将s[prop]初始化为数组或者对象
son[prop] = (dad[prop].constructor === Array) ? [] : {};
clone(dad[prop],son[prop]);
}
else{
son[prop]=dad[prop];
}
};
return son;//返回s对象
}; clone(dad,son);
son.name='ze';
console.log(son.name);//打印ze
console.log(dad.name);//打印chen
son.man.hight=1999;
console.log(son.man.hight);//打印1999
console.log(dad.man.hight);//打印188

打印结果:

参考文档:http://www.cnblogs.com/MECN/p/6606119.html

js中的拷贝问题的更多相关文章

  1. JS中深浅拷贝 函数封装代码

    一.了解 基本数据类型保存在栈内存中,按值访问,引用数据类型保存在堆内存中,按址访问. 二.浅拷贝 浅拷贝只是复制了指向某个对象的指针,而不是复制对象本身,新旧对象其实是同一内存地址的数据,修改其中一 ...

  2. js中的深浅拷贝

    js中的深浅拷贝 js中有深拷贝.浅拷贝一说,所谓的深浅拷贝是针对value类型为引用类型(函数.对象.数组)而言的,大概理解的就是: 浅拷贝: 拷贝出的对象c和原始对象o,c和o在key对应的val ...

  3. JS 中没有按地址(引用)传递,只有按值传递

    很多人,包括我,受书本知识消化不彻底的影响,认为 JS 中参数有两种传递方式:数字.字符串等按值传递:数组.对象等按地址(引用)传递.对此种观点,我们要谨慎. var v1 = [] var v2 = ...

  4. 对js中Function的浅见

    它到底是什么 String Array 都是系统内置对象(已经定义好,可以直接使用)当然,这货也是一样,我们之前定义的函数,其实就是一个这货的实例. 在JS中,所有的对象都是由函数实现的,函数的数据类 ...

  5. JS中基本类型与包装类型的关系

    对于JS中一些类型的转化的东西,自己测试并得出的结论,有错误的地方请大大们留言. 不多废话,直接贴代码,测试请直接拷贝全部代码: <!DOCTYPE html> <html> ...

  6. 小结JS中的OOP(中)

    此篇文章主要是提炼<JavaScript高级程序设计>中第六章的一些内容. 一:JS中OOP相关的概念 开始之前先总结JS中OOP相关的一些概念: 构造函数:JS中的构造函数就是普通的函数 ...

  7. js 中使用工厂方法和构造器方法

    1 直接创建对象 <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...

  8. 详解js中的寄生组合式继承

    寄生组合式继承是js中最理想的继承方式, 最大限度的节省了内存空间. js中的寄生组合式继承要求是: 1.子对象有父对象属性的副本, 且这些不应该保存在子对象的prototype上.       2. ...

  9. js中escape的用法----前端页面简单加密

    escape() 方法,它用于转义不能用明文正确发送的任何字符.比如,电话号码中的空格将被转换成字符 %20,从而能够在 URL 中传递这些字符. http://localhost:8080/a?na ...

随机推荐

  1. iOS在GitHub Top 前100 简介

    主要对当前 GitHub 排名前 100 的项目做一个简单的简介, 方便初学者快速了解到当前 Objective-C 在 GitHub 的情况. 项目名称 项目信息 1. AFNetworking 作 ...

  2. android 获取Bitmap位图所占用的内存大小

    今天在看Universal-Image-Loader源码的时候,在对图片的超过用户在所设的阈值的时候,系统会调用GC将LinkHashMap比较靠底层的图片引用去掉,这里涉及到一个技术单个图片的文图大 ...

  3. java 深入理解内部类以及之间的调用关系

    什么是内部类 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和 ...

  4. java并发包分析之———concurrentHashMap

    一.Map体系 Hashtable是JDK 5之前Map唯一线程安全的内置实现(Collections.synchronizedMap不算).Hashtable继承的是Dictionary(Hasht ...

  5. HTML元素的专用传参数据属性

    把参数直接放到事件定义里面,类似下面这样,也是可以,但是这样不够Nice. <a href="javascript:void(0)" onclick="clickh ...

  6. error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug

    属性1. 在工程上右键->属性->c/c++->代码生成->运行库 四个选项及含义分别如下: 1.1 /MDd:MD_DynamicDebug,我理解是 "共享DLL ...

  7. HTML 学习笔记 day three

    HTML学习笔记 Day three 7.2插入多媒体元素 插入音乐 语法结构:<embed  src=”音乐文件的路径”></embed> 属性: Autostart:他只有 ...

  8. Mac下MySQL无my-default.cnf

    转自https://www.jianshu.com/p/628bcf8bb557 As of MySQL 5.7.18, my-default.ini is no longer included in ...

  9. Spring温故而知新 – AOP代理

    AOP的概念 AOP:Aspect-Oriented Programming(面向切面编程),维基百科的解释如下:Aspect是一种新的模块化机制,用来描述分散在对象.类或者函数中的横切关注点,从关注 ...

  10. 阿里Java架构师谈谈架构和如何成为一个Java架构师

    架构的定义 我们来看看软件架构的一般定义: 程序和计算系统软件体系结构是指系统的一个或多个结构. 该结构包括软件的构建,构建的外部可见属性以及它们之间的相互关系. 该体系结构不是可操作的软件. 具体来 ...