浅拷贝的实现


// 浅拷贝函数
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. MarioTCP:一个单机可日30亿的百万并发长连接服务器

    原文:http://blog.csdn.net/everlastinging/article/details/10894493 注:如果用此服务器做变长data的传输,请在业务处理函数中为input ...

  2. STM32之使用库函数驱动LED灯

    一.熟悉GPIO结构体 以下这个结构体是我从官方手册中获取的: typedef struct { u16 GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMod ...

  3. python JoinableQueue在生产者消费者项目中的简单应用

    class multiprocessing.JoinableQueue([maxsize]) JoinableQueue, a Queue subclass, is a queue which add ...

  4. CentOS 7 下安装mosquitto

    简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台,几乎可以把 ...

  5. webapi从入门到放弃(一)OWIN 自寄宿模式

     1.创建web空项目 2.创建完如图 3.安装如下程序包Microsoft.AspNet.WebApi.Core (5.2.4)Microsoft.Owin.Host.SystemWeb (4.0. ...

  6. kubernetes-dashboard(1.8.3)部署与踩坑

    Kubernetes Dashboard 是一个管理Kubernetes集群的全功能Web界面,旨在以UI的方式完全替代命令行工具(kubectl 等). 目录 部署 创建用户 集成Heapster ...

  7. java基础语法(二)--单列模式

    java基础语法(二)--单列模式 /** * 功能:单列模式 * @author Administrator * */ public class SingletonTest { public sta ...

  8. werfault进程使用CPU率高

    werfault进程是Windows vista 错误报告进程,是用来向微软反馈报告.是安全的正常进程. 解决方法:1.打开控制面板”—“系统和维护”,点击“问题报告和解决方案”. 2.点击“更改设置 ...

  9. MySQL Join 的实现原理

    在寻找Join 语句的优化思路之前,我们首先要理解在MySQL 中是如何来实现Join 的,只要理解了实现原理之后,优化就比较简单了.下面我们先分析一下MySQL 中Join 的实现原理.在MySQL ...

  10. WebRequestHelper

    老是浪费时间写这个类,干脆记录在博客里: public class WebRequestHelper { #region Post public static CookieContainer GetC ...