日期:2014-05-16 浏览次数:20405 次
var arr = new Array(1,2,3); //原始数组。 var newarr = new Array(); newarr = arr.concat(); newarr[0] = newarr[0] + 100; alert("克隆出来的数组的第一个元素的值为:" + newarr[0] + ",原始数组的值为:" + arr[0]); //这样对于简单的数据类型可以达到完全克隆的效果。新元素的值为101 ,原始数组里的值不变。1。 //但是,请看下面。
//上面的方法达到了简单数组克隆的目地了。现在新的问题来了 var arr = new Array(); //原始数组。 var a = { name: "张三", age: 20 }; var b = { name: "李四", age: 30 }; var c = { name: "王武", age: 40 }; arr.push(a); arr.push(b); arr.push(c); var newarr = new Array(); newarr = arr.concat();//复制 //删除其最后一个元素。 newarr.pop(); //更改其中李四的年龄为100 newarr[1].age = 100; //打印结果看下。 alert("复制的数组的长度为:" + newarr.length + ",李四的年龄为:" + newarr[1].age); alert("原始的数组的长度为:" + arr.length + ",李四的年龄为:" + arr[1].age); // 现在新元素的长度变成 2了。而并没有影响到原始数组的数组长度,原始数组的数组长度依然为3.但:数组当中的第二个元素,也就是李四的年龄。。。在我们更改了复制的新数组里面的年龄时,,,原始数组也变了。。这个不是我们想要的结果。。。。
Object.prototype.clone = function () { var o = {}; for (var i in this) { o[i] = this[i]; } return o; }; Array.prototype.clone = function () { var arr = []; for (var i = 0; i < this.length; i++) if (typeof i !== 'object') { arr.push(i); } else { arr.push(i.clone()); } return arr; }; var p1 = { name: 'Rattz', age: 20, hello: function () { return "I'm " + name; } }; var p2 = p1.clone(); p2.age++; alert(p1.age); var arr1 = [12, 'a', p1,{}]; var arr2 = arr1.clone(); arr2[2].name = 'Mike'; alert(arr1[2].name);
------解决方案--------------------
如果一定要实现clone方法,非扩展原型及不迭代的方法实现如下
var cloneOpr = { cloneObj: function (obj) { var newObj = []; for (var i in obj) { newObj[i] = obj[i]; } return newObj; }, cloneArr: function (arr) { var newArr = []; for (var i = 0; i < arr.length; i++) { if (typeof arr[i] === 'object') { newArr.push(this.cloneObj(arr[i])); } else { newArr.push(this[i]); } } return newArr; } }; var obj = { id: 1 }; var obj2 = cloneOpr.cloneObj(obj); obj2.id = 'Mike'; alert(obj.id); alert(obj2.id); var arr = [1, 'a', {id: '20'}]; var arr2 = cloneOpr.cloneArr(arr); arr[2].id = "new id"; alert(arr[2].id); alert(arr2[2].id);