近期項目因為怕數據污染所以用到了js的對象複製 js里的對象都是繼承自object,是引用類型,所以無法通過=號複製 所以整理了一些常用的複製方法,如下 一、通過JSON序列化和反序列化創建新的對象 測試一下: 測試結果: 然而,這個方法並不能進行深度複製,對於function屬性並不能複製到。那麼 ...
近期項目因為怕數據污染所以用到了js的對象複製
js里的對象都是繼承自object,是引用類型,所以無法通過=號複製
所以整理了一些常用的複製方法,如下
一、通過JSON序列化和反序列化創建新的對象
1 var obj = { a: 1, b: '2' }; 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);
測試一波: