通过递归的方式实现深度clone
来源:互联网 发布:suse linux snmp 安装 编辑:程序博客网 时间:2024/05/18 01:32
预备知识:
各种数据类型的赋值方法及类型判断方法
值类型和引用类型的区别
数组和对象的遍历方法
递归算法
预计工作量
半小时
具体描述
实现方法clone,可以用其针对可能是任何类型的对象,进行值拷贝
例如
var a = 1;
var b = clone(a);
b = 2;
console.log(a, b); // 1, 2
--------
var a = [1, 2];
var b = clone(a);
a[0] = 'changed a';
b[1] = 'changed b';
console.log(a, b); // a:['changed a', 2],b:[1, changed b]
--------
var a = {
key1: 'value1',
key2: [{
id: 1,
data: [10, 20]
}, {
id: 2,
data: [20, 30]
}]
}
var b = clone(a);
b.key1 = 'value changed';
b.key2[1].data[0] = 'changed data';
console.log(a, b);
==============================================================================================================================
javascript类型判断 typeof
基本类型:传值 Number Boolean null undefined
引用类型:传引用 Array、Object、function
特殊类型 String :传值
数组和对象的遍历方法:http://www.cnblogs.com/yun007/archive/2013/06/06/3121393.html
数组:由于 for in 循环会枚举原型链上的所有属性,唯一过滤这些属性的方式是使用hasOwnProperty 函数,因此会比普通的 for 循环慢上好多倍。
为了达到遍历数组的最佳性能,推荐使用经典的 for 循环,通过 l = list.length 来缓存数组的长度。
var list = [1, 2, 3, 4, 5, ...... 100000000];for(var i = 0, l = list.length; i < l; i++) { console.log(list[i]);}
对象:遍历对象的所有属性值和方法http://www.cnblogs.com/xiangniu/archive/2012/08/19/2646393.html
/** 用来遍历指定对象所有的属性名称和值* obj 需要遍历的对象* author: Jet Mah* website: http://www.javatang.com/archives/2006/09/13/442864.html */ function allPrpos(obj) { // 用来保存所有的属性名称和值 var props = ""; // 开始遍历 for(var p in obj){ // 方法 if(typeof(obj[p])=="function"){ obj[p](); }else{ // p 为属性名称,obj[p]为对应属性的值 props+= p + "=" + obj[p] + "\t"; } } // 最后显示所有的属性 alert(props);}
总结:遍历数组和对象的区别
<script> //----------------for用来遍历数组对象-- var i,myArr = [1,2,3]; for (var i = 0; i < myArr.length; i++) { console.log(i+":"+myArr[i]); }; //---------for-in 用来遍历非数组对象 var man ={hands:2,legs:2,heads:1}; //为所有的对象添加clone方法,即给内置原型(object,Array,function)增加原型属性,该方法很强大,也很危险 if(typeof Object.prototype.clone ==="undefined"){ Object.prototype.clone = function(){}; } // for(var i in man){ if (man.hasOwnProperty(i)) { //filter,只输出man的私有属性 console.log(i,":",man[i]); }; } //输出结果为print hands:2,legs:2,heads:1 for(var i in man) {//不使用过滤 console.log(i,":",man[i]); } //输出结果为 //hands : 2 index.html:20 //legs : 2 index.html:20 //heads : 1 index.html:20 //clone : function (){} for(var i in man) { if(Object.prototype.hasOwnProperty.call(man,i)) { //过滤 console.log(i,":",man[i]); } } //输出结果为print hands:2,legs:2,heads:1</script>
兼容值类型的JavaScript对象Clone方法
在JavaScript面向对象编程中使用继承(5)
javascript构造函数与prototype
javascript 冒号 使用说明
代码最终查到了浅谈Javascript 中几种克隆(clone)方式
function clone(obj) { var o; if (typeof obj == "object") { if (obj === null) { o = null; } else { if (obj instanceof Array) { o = []; for (var i = 0, len = obj.length; i < len; i++) { o.push(clone(obj[i])); } } else { o = {}; for (var j in obj) { o[j] = clone(obj[j]); } } } } else { o = obj; } return o;
- 通过递归的方式实现深度clone
- 通过序列化的方式实现深clone
- 深度clone的简单实现
- 多级菜单的横向导航通过非递归方式实现
- JavaScript深度复制(deep clone)的实现方法
- 通过实现Cloneable接口和覆盖clone()方法实现深度克隆,以及如何通过ByteArrayIOStream实现克隆
- php 实现递归的方式
- 二叉树的深度,递归和非递归实现
- 影子clone,深度clone
- 影子clone,深度clone
- 深度学习FPGA实现基础知识19(通过文件读写方式实现Matlab和Modelsim的联合仿真)
- java通过递归实现文件夹的删除
- java的对象与引用,影子clone与深度clone
- clone方法的实现
- 使用递归方式实现的二叉树
- MySQL join 的方式 实现递归
- java递归的简单实现方式
- 不同的参数传递方式对递归函数递归深度的影响
- window对象的alert() confirm() prompt()方法
- sprintf 格式化数字字符串
- 《全民攻城》开心周末,好礼相赠
- mongo 查询
- ios调用系统照片库/拍照/录像
- 通过递归的方式实现深度clone
- 【Git学习笔记】 git克隆远程项目并创建本地对应分支
- 《全民攻城》3月29日9:30震撼开启S4 诸陵之战
- 关于cell上button点击事件如何传到不同界面
- CGLib与jdk的优缺点
- 【读书笔记】Google软件测试之道(二)软件测试开发工程师
- 【Android开发】基本组件-列表选择框
- 第五周程序阅读(2)
- BAT云服务介绍,开发者平台介绍