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 ...
随机推荐
- Struts源码之OgnlValueStack
public class OgnlValueStack implements Serializable, ValueStack, ClearableValueStack, MemberAccessVa ...
- BP 神经网络
BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一.BP ...
- java中split(regex)使用中要注意的问题:正则表达式
比如我在项目中遇到的(,),.,|,*等等类的符号: String area="(30.13206313822174, 120.4156494140625)(29.8763738070713 ...
- ASP.NET Core 2.0 使用NLog实现日志记录
1.安装NuGet包 1.Install-Package NLog.Web.AspNetCore 2.Install-Package NLog 在csproj中编辑: <PackageRefer ...
- The 4 Essentials of Video Content Marketing Success
https://www.entrepreneur.com/article/243208 As videos become increasingly popular, they provide the ...
- Django中的Python高级特性
本小文的内容实际是作为<Pro Django>第二版第二章的读书笔记简单总结. 1.类的构建:元类,使用带元类的基类----这个特性的案例主要就是models.Model类,用这种方式高效 ...
- Using SSH and SFTP in Mac OS X
http://answers.stat.ucla.edu/groups/answers/wiki/7a848/ SH and SFTP are command line applications av ...
- Wooden Sticks -HZNU寒假集训
Wooden Sticks There is a pile of n wooden sticks. The length and weight of each stick are known in a ...
- 安装vmware tool时出错
背景: 我想要在win10系统和vmware的ubuntu之间实现磁盘共享,从而实现文件共享.百度到可以通过安装vmware tools实现,所以着手安装vmware tools 问题: 安装vmwa ...
- python3 分布式爬虫
背景 部门(东方IC.图虫)业务驱动,需要搜集大量图片资源,做数据分析,以及正版图片维权.前期主要用node做爬虫(业务比较简单,对node比较熟悉).随着业务需求的变化,大规模爬虫遇到各种问题.py ...