拷贝简单分为浅拷贝与深度拷贝,即给定一个对象,生成一个相同的对象。

浅拷贝

function copy(source,destiny){
destiny = destiny || {};
if(typeof(source) === 'object'){  //  是object或者array
for(var i in source){
if(source.hasOwnProperty(i)){
destiny[i] = source[i];
}
}
}else{  //string number boolean,undefined null
destiny = source;
} return destiny;
}

  简单测试一下:

var ls = {
a:12,
b:22,
c:{
c1:1,
c2:2
}
};
var ld = copy(ls);
console.log(ld);

  结果:

[object Object] {
a: 12,
b: 22,
c: [object Object] {
c1: 1,
c2: 2
}
}

  但是,如果改变新生成对象的值,再查看一下source对象

ld.c.c1=3;
console.log(ls);
[object Object] {
a: 12,
b: 22,
c: [object Object] {
c1: 3,
c2: 2
}
}

  发现source对象也被改变,说明,对于复杂对象(key对应的value值为对象),进行浅拷贝,key对应的使用的是同一个引用,很容易引起问题。

深拷贝

function deepCopy(source,destiny){
destiny = destiny || {};
var i;
for( i in source){
if(source.hasOwnProperty(i)){
if(typeof(source[i]) === "object"){
destiny[i] = Object.prototype.toString.call(source[i]) === "[object Array]" ? [] : {};
deepCopy(source[i],destiny[i]); //递归调用
}else{
destiny[i] = source[i];
}
}
}
return destiny;
}

  测试一下:

var s = {
a:1,
b:{
b1:2,
b2:3
},
c:[4,5]
};
var d = deepCopy(s);

  

[object Object] {
a: 1,
b: [object Object] {
b1: 2,
b2: 3
},
c: [4, 5]
}

  

d.b.b1=22;
console.log(s);

  console.log(s)对应的值:

[object Object] {
a: 1,
b: [object Object] {
b1: 2,
b2: 3
},
c: [4, 5]
}

  测试地址 : http://jsbin.com/higijadatalu/1/edit

javascript 拷贝的更多相关文章

  1. javascript 拷贝文本

    最近做了几个小网站,想在平时活动的论坛里面宣传一下,操作方式就是在留言时快速添加上自己的小广告.为了方便贴广告,写了一个油猴子脚本. 起先的设计是在页面中添加一个按钮,点击按钮自动将小广告插入到光标的 ...

  2. javascript拷贝创建对象

    ​ /*拷贝创建对象*/ function hightExtend() { var key = 0, i = 0, len = arguments.length; target = null; if ...

  3. javascript拷贝

    function copy(obj){ //浅拷贝 var result = {}; for(var attr in obj){ result[attr] = obj[attr]; } return ...

  4. ( 译、持续更新 ) JavaScript 上分小技巧(四)

    后续如有内容,本篇将会照常更新并排满15个知识点,以下是其他几篇译文的地址: 第一篇地址:( 译.持续更新 ) JavaScript 上分小技巧(一) 第二篇地址:( 译.持续更新 ) JavaScr ...

  5. 如何在Blog中加入Google Analytics

    原文链接:https://www.cnblogs.com/procoder/archive/2010/03/04/Google-Analytics-Blog.html 背景 在之前加入了一个网站统计工 ...

  6. javascript继承(五)—prototype最优两种继承(空函数和循环拷贝)

    一.利用空函数实现继承 参考了文章javascript继承—prototype属性介绍(2) 中叶小钗的评论,对这篇文章中的方案二利用一个空函数进行修改,可以解决创建子类对象时,父类实例化的过程中特权 ...

  7. 超实用的JavaScript代码段 Item8 -- js对象的(深)拷贝

    js 对象 浅拷贝 和 深拷贝 1.浅拷贝 拷贝就是把父对像的属性,全部拷贝给子对象. 下面这个函数,就是在做拷贝: var Chinese = { nation:'中国' } var Doctor ...

  8. JavaScript特效制作经典精讲(案例入门详解、可直接粘贴拷贝运行、史上最牛案例)

    技巧一.添加链接提示 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// ...

  9. JavaScript 对象拷贝研究

    介绍一下JavaScript里面的一些对象拷贝的方法 浅拷贝 深拷贝 利用序列化进行对象拷贝

随机推荐

  1. Delphi 调用外部程序并等待其运行结束

    转自:http://blog.csdn.net/xieyunc/article/details/4140620   如何让Delphi调用外部程序并等待其运行结束 1. uses     Window ...

  2. 最好的10本适用于初学者阅读的javaScript和jQuery书籍

    现在有许多方式学习新的内容,但是对于刚开始学习和寻找真正沉迷其中的平和状态的人而言,经典的纸质书籍依旧是首选.我发现阅读一本纸质书籍会让自己远离那些在使用电脑和平板时出现的令人不安的情绪.电子书和播客 ...

  3. mysql执行update报错1175解决方法

    mysql执行update报错 update library set status=true where 1=1 Error Code: 1175. You are using safe update ...

  4. 连接SQLServer2005失败--[Microsoft][ODBC SQL Server Driver][DBNETLIB]一般性网络错误。请检查网络文档

    连接SQLServer2005失败,错误信息: 错误类型:Microsoft OLE DB Provider for ODBC Drivers (0x80004005)[Microsoft][ODBC ...

  5. ets dets

    相同点:ets和dets都提供“键—值”搜索表 不同点:ets驻留在内存,dets驻留在磁盘 特点:ets表和dets表可以被多个进程共享,因此通过这两个模块可以实现数据间的交换 一  ets表 实现 ...

  6. Hadoop构成

    What Is Apache Hadoop? The Apache™ Hadoop® project develops open-source software for reliable, scala ...

  7. SharePoint咨询师之路:备份和恢复系列三 - 备份web和服务应用程序

    本系列包括: 备份服务器场和配置 备份web和服务应用程序 备份内容数据库 备份网站集 备份自定义项 备份web应用程序和服务应用程序一样有三种方式:SharePoint管理中心网站.Windows  ...

  8. 使用DNSPod来处理网站的均衡负载(转)

    add by zhj:配置倒是蛮简单的,其实就是把域名与多个IP进行关联,在数据库中实现这个应该也是蛮简单的. 原文:http://kb.cnblogs.com/page/75571/ 首先介绍下DN ...

  9. 创建并使用Windows Azure虚拟机模板

    在现实的IaaS应用中,往往会创建自己的虚拟机映像模板,以满足快速应用部署的目标,如预先配置好某些应用.管理与监控管理等. 1.登录到Windows Azure Dashboard中创建一个做为模板的 ...

  10. 主题敏感词PageRank

    [主题敏感词PageRank] PageRank忽略了主题相关性,导致结果的相关性和主题性降低,对于不同的用户,甚至有很大的差别.例如,当搜索“苹果”时,一个数码爱好者可能是想要看 iphone 的信 ...