javascript 拷贝
拷贝简单分为浅拷贝与深度拷贝,即给定一个对象,生成一个相同的对象。
浅拷贝
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 拷贝的更多相关文章
- javascript 拷贝文本
最近做了几个小网站,想在平时活动的论坛里面宣传一下,操作方式就是在留言时快速添加上自己的小广告.为了方便贴广告,写了一个油猴子脚本. 起先的设计是在页面中添加一个按钮,点击按钮自动将小广告插入到光标的 ...
- javascript拷贝创建对象
/*拷贝创建对象*/ function hightExtend() { var key = 0, i = 0, len = arguments.length; target = null; if ...
- javascript拷贝
function copy(obj){ //浅拷贝 var result = {}; for(var attr in obj){ result[attr] = obj[attr]; } return ...
- ( 译、持续更新 ) JavaScript 上分小技巧(四)
后续如有内容,本篇将会照常更新并排满15个知识点,以下是其他几篇译文的地址: 第一篇地址:( 译.持续更新 ) JavaScript 上分小技巧(一) 第二篇地址:( 译.持续更新 ) JavaScr ...
- 如何在Blog中加入Google Analytics
原文链接:https://www.cnblogs.com/procoder/archive/2010/03/04/Google-Analytics-Blog.html 背景 在之前加入了一个网站统计工 ...
- javascript继承(五)—prototype最优两种继承(空函数和循环拷贝)
一.利用空函数实现继承 参考了文章javascript继承—prototype属性介绍(2) 中叶小钗的评论,对这篇文章中的方案二利用一个空函数进行修改,可以解决创建子类对象时,父类实例化的过程中特权 ...
- 超实用的JavaScript代码段 Item8 -- js对象的(深)拷贝
js 对象 浅拷贝 和 深拷贝 1.浅拷贝 拷贝就是把父对像的属性,全部拷贝给子对象. 下面这个函数,就是在做拷贝: var Chinese = { nation:'中国' } var Doctor ...
- JavaScript特效制作经典精讲(案例入门详解、可直接粘贴拷贝运行、史上最牛案例)
技巧一.添加链接提示 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// ...
- JavaScript 对象拷贝研究
介绍一下JavaScript里面的一些对象拷贝的方法 浅拷贝 深拷贝 利用序列化进行对象拷贝
随机推荐
- linux中hosts文件的修改
转载自http://hi.baidu.com/dillisbest/item/5e0b612d011b4cd40e37f9a6 1. 关于/etc/host,主机名和IP配置文件 Hosts - Th ...
- JavaWeb高性能开发(一)
今日要闻: 淘宝删差评产业链 在你给出"差评""中评"后不久,有人会偷偷登录你的淘宝账户,把你之前给过的评价删除或改成"好评".而这种人就是 ...
- Maven异常: No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK解决(能力工场小马哥)
问题描述: No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JD ...
- poj2528(线段树+离散化)Mayor's posters
2016-08-15 题意:一面墙,往上面贴海报,后面贴的可以覆盖前面贴的.问最后能看见几种海报. 思路:可以理解成往墙上涂颜色,最后能看见几种颜色(下面就是以涂色来讲的).这面墙长度为1~1000 ...
- Codeforces Educational Codeforces Round 15 C. Cellular Network
C. Cellular Network time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- Operation not applicable
ClientDataSet.DataSetProvider1 Operation not applicable ClientDataSet1->Open(); 解决办法 1.update new ...
- MySQL/MariaDB/Percona数据库升级脚本
MySQL/MariaDB/Percona数据库升级脚本截取<OneinStack>中upgrade_db.sh, 一般情况下不建议升级数据库版本,该脚本专提供给各位版本控们.为防止大版本 ...
- OSPF虚链路配置.示例2
先看一个拓扑图 黄色区域是area0,即骨干区域,如果如图示RT1与RT6之间的链路断了,那么会出现骨干区域被“分裂”的情况,很明显骨干区域是不能被分割开的,出现这种状况的时候可能会影响到整个自制系统 ...
- 结合windows消息系统理解C#中WndProc函数和DefWndProc函数
Windows消息系统由3部分组成: 1.消息队列.Windows应用程序的消息是由Windows统一在一个消息队列中管理的. 2.消息循环.应用程序从Windows消息队列中获得自己 ...
- IAP内购
IAPHelper.h // // IAPHelper.h // airplay // // Created by apple on 13-10-23. // Copyright (c) 2013年 ...