JavaScript对象复制
近期项目因为怕数据污染所以用到了js的对象复制
js里的对象都是继承自object,是引用类型,所以无法通过=号复制
所以整理了一些常用的复制方法,如下
一、通过JSON序列化和反序列化创建新的对象
 var obj = { a: 1, b: '2' };
 var newObj = JSON.parse(JSON.stringify(obj));
测试一下:
obj.a = 3;//obj和newObj指向了不同的引用,所以newObj的b属性并不会变化
console.log(newObj);
console.log(obj);
测试结果:

然而,这个方法并不能进行深度复制,对于function属性并不能复制到。那么就有了下面的深度复制方式
二、深度对象复制
function clone(o) {
    var s = {};
    for (var k in o)
        s[k] = typeof o[k] === 'object' ? clone(o[k]) : o[k];
    return s;
}
测试一波:
var obj = {
    a: 1,
    b: 'b',
    c: false,
    d: new Date(),
    e: { e: 1 },
    f: function () { console.log(this.g) },
    g: [1, 2]
};
var newObj = clone(obj);
console.log(newObj);
newObj.f();
测试结果:

二、Array的快速复制
Array.prototype.concat可以拼接两个数组并返回新对象,利用这一特性,可以快速复制一个数组
var arr1 = [1];
var arr2 = [].concat(arr1);
测试一波:

JavaScript对象复制的更多相关文章
- JavaScript对象复制(一)(转载)
		
在JavaScript很多人复制一个对象的时候都是直接用"=",因为大家都觉得脚本语言是没有指针.引用.地址之类的,所以直接用"="就可以把一个对象复制给另外一 ...
 - Javascript 对象复制
		
如果对象只是一个数据集,可采用json化再反json化的方式克隆一个对象,这个过程会丢失对象的方法.效率比较低. 可以采用如下递归的方式复制一个对象. function clone(target) { ...
 - Javascript 对象复制(深浅拷贝)
		
一.数据类型分类: 基本变量 引用类型 二.什么叫做指针指向 栈内存.堆内存.指针指向(如下红圈圈的斜线). 三.赋值.拷贝.引用区别? 赋值指一个变量赋予某个值,包含两种方式,一种是直接量,另一种, ...
 - JavaScript对象复制(二)
		
<script> function copy(a) { ret = {}; for (sth in a) { temp = a[sth]; if (temp instanceof Arra ...
 - 【转】JavaScript中的对象复制(Object Clone)
		
JavaScript中并没有直接提供对象复制(Object Clone)的方法.因此下面的代码中改变对象b的时候,也就改变了对象a. a = {k1:1, k2:2, k3:3}; b = a; b. ...
 - JavaScript对象的深浅复制
		
前言 从层次上来看,对象的复制可以简单地分为浅复制和深复制,顾名思义,浅复制是指只复制一层对象的属性,不会复制对象中的对象的属性,对象的深复制会复制对象中层层嵌套的对象的属性. 在复制对象时,除了要复 ...
 - 如何深度复制一个javascript对象
		
前言 最近有人问我,如何将一个对象复制一份,因为他遇到了一个需求,需要将后端获取的数据,保存一份,原始数据会因为交互而发生变化,最终需要对比两份数据的异同. 他是一个刚入行的小朋友,他的实现方式就是新 ...
 - web前端学习(二)  javascript对象和原型继承
		
目录 1. JavaScrpt对象 2. 原型对象和继承 3. 对象的克隆 (1)javascript对象 在JS中,对象是属性的容器.对于单个对象来说,都由属性名和属性值构成:其中属性名需要是标识符 ...
 - JS对象复制
		
在JavaScript很多人复制一个对象的时候都是直接用"=",因为大家都觉得脚本语言是没有指针.引用.地址之类的,所以直接用"="就可以把一个对象复制给另外一 ...
 
随机推荐
- .lib和.dll文件
			
LIB文件中存放的是函数调用的信息,值得一提的是数据库有静态数据库(.lib文件)和动态数据库(.dll文件). 静态编译 静态编译将导出声明和实现都放在lib中.编译后所有代码都嵌入到宿主程序. 静 ...
 - Unity创作赛车游戏的四款插件
			
本文,我们将介绍其中4款:Racing Game Starter Kit.GeNa 2 .NWH Vehicle Physics.Curvy Splines. Racing Game Starter ...
 - git - gitHub生成Markdown目录
			
就是github-markdown-toc.go. github-markdown-toc.go Github地址 如果你有GO语言(又是你)的编译环境,可以尝试自己编译,如果没有,可以直接下载编译好 ...
 - Python3基础 tuple(list) 改变list元素的内容时,元组的id值不变
			
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
 - linux系统(centos6)的目录结构
			
/bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令. /boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件. /dev :dev是Device( ...
 - java算法 -- 基数排序
			
基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较.由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排 ...
 - MSYS2 编译环境配置
			
博客转载自:https://medium.com/@fzubair/carnd-term2-gcc-setup-on-windows-287e1fd36845 2018/6/2 — mingw32/c ...
 - 有相关性就有因果关系吗,教你玩转孟德尔随机化分析(mendelian randomization )
			
流行病学研究常见的分析就是相关性分析了. 相关性分析某种程度上可以为我们提供一些研究思路,比如缺乏元素A与某种癌症相关,那么我们可以通过补充元素A来减少患癌率.这个结论的大前提是缺乏元素A会导致这种癌 ...
 - Python3 queue队列类
			
class queue.PriorityQueue(maxsize=0) 优先级队列构造函数. maxsize 是个整数,用于设置可以放入队列中的项目数的上限.当达到这个大小的时候,插入操作将阻塞至队 ...
 - [LeetCode] 88. Merge Sorted Array 合并有序数组
			
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: T ...