javascript中对象的深度克隆
记录一个常见的面试题,javascript中对象的深度克隆,转载自:http://www.2cto.com/kf/201409/332955.html
今天就聊一下一个常见的笔试、面试题,js中对象的深度克隆。翻了下这个题目,在很多地方出现过,已经算一个老的题目了,但是每年的校招中总会考到,其实想想,这个题目考查的知识点还是蛮多的,尤其是对基础知识的考查。好了,闲话不多说,开始正题。
- //数值克隆的表现
- var a="1";
- var b=a;
- b="2";
- console.log(a);// "1"
- console.log(b);// "2"
- //字符串克隆的表现
- var c="1";
- var d=c;
- d="2";
- console.log(c);// "1"
- console.log(d);// "2"
- //字符串克隆的表现
- var x=true;
- var y=x;
- y=false;
- console.log(x);// true
- console.log(y);// false
从上面的代码大家可以看出,原始类型即使我们采用普通的克隆方式仍能得到正确的结果,原因就是原始类型存储的是对象的实际数据。
- var m=function(){alert(1);};
- var n=m;
- n=function(){alert(2);};
- console.log(m());//
- console.log(n());//
- var oPerson={
- oName:"rookiebob",
- oAge:"18",
- oAddress:{
- province:"beijing"
- },
- ofavorite:[
- "swimming",
- {reading:"history book"}
- ],
- skill:function(){
- console.log("bob is coding");
- }
- };
- function clone(obj){
- var result={};
- for(key in obj){
- result[key]=obj[key];
- }
- return result;
- }
- var oNew=clone(oPerson);
- console.log(oPerson.oAddress.province);//beijing
- oNew.oAddress.province="shanghai";
- console.log(oPerson.oAddress.province);//shanghai
- //返回传递给他的任意对象的类
- function isClass(o){
- if(o===null) return "Null";
- if(o===undefined) return "Undefined";
- return Object.prototype.toString.call(o).slice(8,-1);
- }

- //深度克隆
- function deepClone(obj){
- var result,oClass=isClass(obj);
- //确定result的类型
- if(oClass==="Object"){
- result={};
- }else if(oClass==="Array"){
- result=[];
- }else{
- return obj;
- }
- for(key in obj){
- var copy=obj[key];
- if(isClass(copy)=="Object"){
- result[key]=arguments.callee(copy);//递归调用
- }else if(isClass(copy)=="Array"){
- result[key]=arguments.callee(copy);
- }else{
- result[key]=obj[key];
- }
- }
- return result;
- }
- //返回传递给他的任意对象的类
- function isClass(o){
- if(o===null) return "Null";
- if(o===undefined) return "Undefined";
- return Object.prototype.toString.call(o).slice(8,-1);
- }
- var oPerson={
- oName:"rookiebob",
- oAge:"18",
- oAddress:{
- province:"beijing"
- },
- ofavorite:[
- "swimming",
- {reading:"history book"}
- ],
- skill:function(){
- console.log("bob is coding");
- }
- };
- //深度克隆一个对象
- var oNew=deepClone(oPerson);
- oNew.ofavorite[1].reading="picture";
- console.log(oNew.ofavorite[1].reading);//picture
- console.log(oPerson.ofavorite[1].reading);//history book
- oNew.oAddress.province="shanghai";
- console.log(oPerson.oAddress.province);//beijing
- console.log(oNew.oAddress.province);//shanghai
- //深度克隆
- function deepClone(obj){
- var result={},oClass=isClass(obj);
- // if(oClass==="Object"){
- // result={};
- // }else if(oClass==="Array"){
- // result=[];
- // }else{
- // return obj;
- // }
- for(key in obj){
- var copy=obj[key];
- if(isClass(copy)=="Object"){
- result[key]=arguments.callee(copy);
- }else if(isClass(copy)=="Array"){
- result[key]=arguments.callee(copy);
- }else{
- result[key]=obj[key];
- }
- }
- return result;
- }
- function isClass(o){
- if(o===null) return "Null";
- if(o===undefined) return "Undefined";
- return Object.prototype.toString.call(o).slice(8,-1);
- }
- //克隆一个数组
- var arr=["a","b","c"];
- var oNew=deepClone(arr);
- console.log(oNew);//Object {0: "a", 1: "b", 2: "c"}
javascript中对象的深度克隆的更多相关文章
- JavaScript实现对象的深度克隆及typeof和instanceof【简洁】【分享】
JavaScript实现对象的深度克隆 代码实现如下: <!DOCTYPE html> <html lang="en"> <head> < ...
- javascript对象的深度克隆
在做项目的时候需要向对象里面添加新属性,又不想修改原对象.于是就写: var newObj = oldObj,但是新对象属性改变后就对象也会跟着改变,这是因为无论是新对象还是旧对象,指向的内存地址都是 ...
- js对象的深度克隆
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JAVA对象的深度克隆
有时候,我们需要把对象A的所有值复制给对象B(B = A),但是这样用等号给赋值你会发现,当B中的某个对象值改变时,同时也会修改到A中相应对象的值! 也许你会说,用clone()不就行了?!你的想法只 ...
- javascript中对象字面量的理解
javascript中对象字面量与数组字面量 第一部分 我们知道JavaScript中的数据类型有基本数据类型和引用类型,其中Object类型就是非常常用的类型.那么如果创建一个Object类型的实例 ...
- 关于JavaScript中对象的继承实现的学习总结
一.原型链 JavaScript 中原型链是实现继承的主要方法.其主要的思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.实现原型链有一种基本模式,其代码如下. function Super ...
- MyDAL - 引用类型对象 .DeepClone() 深度克隆[深度复制] 工具 使用
索引: 目录索引 一.API 列表 .DeepClone() 用于 Model / Entity / ... ... 等引用类型对象的深度克隆 特性说明 1.不需要对对象做任何特殊处理,直接 .Dee ...
- JavaScript中对象的属性
在JavaScript中,属性决定了一个对象的状态,本文详细的研究了它们是如何工作的. 属性类型 JavaScript中有三种不同类型的属性:命名数据属性(named data properties) ...
- JavaScript中对象转换为原始值的规则
JavaScript中对象转换为原始值遵循哪些原则? P52 对象到布尔值对象到布尔值的转换非常简单:所有的对象(包括数字和函数)都转换为true.对于包装对象亦是如此:new Boolean(fal ...
随机推荐
- CentOS6修改主机名(hostname)及 修改/etc/hosts 文件,增加ip和hostname的映射关系(转)
CentOS修改主机名(hostname) 需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常.首先切换到root用户. ...
- Python基础一. 简介、变量、对象及引用
一.Python简介 Python是一门计算机编程语言,它是由荷兰人Guido van Rossum在1989年圣诞节期间为了打发无聊的圣诞节而编写的,作为ABC语言的继承 特性: 面向对象.解释型. ...
- zjuoj 3605 Find the Marble
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3605 Find the Marble Time Limit: 2 Seco ...
- SGU 455 Sequence analysis(Cycle detection,floyd判圈算法)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=455 Due to the slow 'mod' and 'div' operati ...
- Magento 自定义一个搜索功能
最近工作中有一个需求是需要做一个搜索的功能,但是因为需要定制一些外观,所以就不用传统的方法来继承基类GRID.实现这个需求的核心其实就是下面这个方法. $this->getLayout()-&g ...
- 14. 星际争霸之php设计模式--状态模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- 网站禁止右键点击js
<script> function stop() { return false; } document.oncontextm ...
- Weblogic 所有BEA错误代码详细信息列表
范围 子系统 类别 BEA-000001 – BEA-009999 ConsensusLeasing DatabaseLessLeasing DatabaseLessLeasing BEA-00010 ...
- Linux top和负载的说明
转自:http://bbs.linuxtone.org/thread-1684-1-1.html top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windo ...
- 如何使官方提供的AppRTCDemo 运行在自己搭建的server(官方提供的apprtc)上(官方的server源码)
原文转自 http://stackoverflow.com/questions/21085261/apprtcdemo-with-local-server-works-between-browsers ...