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里面的一些对象拷贝的方法 浅拷贝 深拷贝 利用序列化进行对象拷贝
随机推荐
- (转载)OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象
在之前的一篇文章中我们说到了Foundation框架中的NSObject对象,那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString. 在OC中 ...
- 演义江湖PC端意见汇总
写在前面: 1.自己的游戏自己玩玩爽不爽,自己爽了才能说玩家可能会接受,自己都玩不下去玩家凭什么玩你的游戏 2.如果你负责美术,那么你到游戏中看看,你如果不能接受,玩家也会觉得游戏很丑 3.如果你负责 ...
- 一排div自由下落
function getstyle(obj,attr) { return obj.currentStyle?obj.currentStyle[attr]:getComputedStyle(obj)[a ...
- android系统的文件夹选择器
aFileChooser: https://github.com/iPaulPro/aFileChooser/issues, 这个是最适合android的文件选择器,看看有无可能改成文件夹选择器. f ...
- 使用avalon 实现一个订座系统
avalon对交互非常复杂的WEB应用具有天然的优势,它拥有两大神器:计算属性(这相当于后端WPF的DependencyProperty)与$watch回调. 我们的订餐系统的要求如下,它有一个总额统 ...
- Centos 64位安装 EPEL源
#直接在线安装rpm包 rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm # ...
- python简单网络服务器
对于服务器来说建立TCP连接的过程分为4步: 1.建立socket对象:这里与客户端一样,依然是: s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) ...
- 创建类模式(四):原型(Prototype)
定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建 ...
- 组合View Controller时遇到的一点问题
View Controller的组合应用其实很常见了,比如说Tab bar controller和Navigation view controller的组合使用,像这种一般都是Navigation v ...
- xhtml和css概述
Xhtml和css概述 1.html的过渡到xhtml html与xhtml不是两种语言,它们是一种语言的不同阶段,有点类似于文言文和白话文之间的关系.因为网络技术的日新月异,html的不断改进,所以 ...