js中的拷贝问题
浅拷贝的实现
// 浅拷贝函数
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中的拷贝问题的更多相关文章
- JS中深浅拷贝 函数封装代码
一.了解 基本数据类型保存在栈内存中,按值访问,引用数据类型保存在堆内存中,按址访问. 二.浅拷贝 浅拷贝只是复制了指向某个对象的指针,而不是复制对象本身,新旧对象其实是同一内存地址的数据,修改其中一 ...
- js中的深浅拷贝
js中的深浅拷贝 js中有深拷贝.浅拷贝一说,所谓的深浅拷贝是针对value类型为引用类型(函数.对象.数组)而言的,大概理解的就是: 浅拷贝: 拷贝出的对象c和原始对象o,c和o在key对应的val ...
- JS 中没有按地址(引用)传递,只有按值传递
很多人,包括我,受书本知识消化不彻底的影响,认为 JS 中参数有两种传递方式:数字.字符串等按值传递:数组.对象等按地址(引用)传递.对此种观点,我们要谨慎. var v1 = [] var v2 = ...
- 对js中Function的浅见
它到底是什么 String Array 都是系统内置对象(已经定义好,可以直接使用)当然,这货也是一样,我们之前定义的函数,其实就是一个这货的实例. 在JS中,所有的对象都是由函数实现的,函数的数据类 ...
- JS中基本类型与包装类型的关系
对于JS中一些类型的转化的东西,自己测试并得出的结论,有错误的地方请大大们留言. 不多废话,直接贴代码,测试请直接拷贝全部代码: <!DOCTYPE html> <html> ...
- 小结JS中的OOP(中)
此篇文章主要是提炼<JavaScript高级程序设计>中第六章的一些内容. 一:JS中OOP相关的概念 开始之前先总结JS中OOP相关的一些概念: 构造函数:JS中的构造函数就是普通的函数 ...
- js 中使用工厂方法和构造器方法
1 直接创建对象 <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...
- 详解js中的寄生组合式继承
寄生组合式继承是js中最理想的继承方式, 最大限度的节省了内存空间. js中的寄生组合式继承要求是: 1.子对象有父对象属性的副本, 且这些不应该保存在子对象的prototype上. 2. ...
- js中escape的用法----前端页面简单加密
escape() 方法,它用于转义不能用明文正确发送的任何字符.比如,电话号码中的空格将被转换成字符 %20,从而能够在 URL 中传递这些字符. http://localhost:8080/a?na ...
随机推荐
- MarioTCP:一个单机可日30亿的百万并发长连接服务器
原文:http://blog.csdn.net/everlastinging/article/details/10894493 注:如果用此服务器做变长data的传输,请在业务处理函数中为input ...
- STM32之使用库函数驱动LED灯
一.熟悉GPIO结构体 以下这个结构体是我从官方手册中获取的: typedef struct { u16 GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMod ...
- python JoinableQueue在生产者消费者项目中的简单应用
class multiprocessing.JoinableQueue([maxsize]) JoinableQueue, a Queue subclass, is a queue which add ...
- CentOS 7 下安装mosquitto
简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台,几乎可以把 ...
- webapi从入门到放弃(一)OWIN 自寄宿模式
1.创建web空项目 2.创建完如图 3.安装如下程序包Microsoft.AspNet.WebApi.Core (5.2.4)Microsoft.Owin.Host.SystemWeb (4.0. ...
- kubernetes-dashboard(1.8.3)部署与踩坑
Kubernetes Dashboard 是一个管理Kubernetes集群的全功能Web界面,旨在以UI的方式完全替代命令行工具(kubectl 等). 目录 部署 创建用户 集成Heapster ...
- java基础语法(二)--单列模式
java基础语法(二)--单列模式 /** * 功能:单列模式 * @author Administrator * */ public class SingletonTest { public sta ...
- werfault进程使用CPU率高
werfault进程是Windows vista 错误报告进程,是用来向微软反馈报告.是安全的正常进程. 解决方法:1.打开控制面板”—“系统和维护”,点击“问题报告和解决方案”. 2.点击“更改设置 ...
- MySQL Join 的实现原理
在寻找Join 语句的优化思路之前,我们首先要理解在MySQL 中是如何来实现Join 的,只要理解了实现原理之后,优化就比较简单了.下面我们先分析一下MySQL 中Join 的实现原理.在MySQL ...
- WebRequestHelper
老是浪费时间写这个类,干脆记录在博客里: public class WebRequestHelper { #region Post public static CookieContainer GetC ...