通过递归的方式实现深度clone
预备知识:
各种数据类型的赋值方法及类型判断方法
值类型和引用类型的区别
数组和对象的遍历方法
递归算法
预计工作量
半小时
具体描述
实现方法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] + " ";
}
}
// 最后显示所有的属性
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>
代码最终查到了
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;
