在前端开发的某些逻辑中,经常需要对现有的js对象创建副本,避免污染原始数据的情况。
如果是简单的一维数组对象,可以使用两个原生方法:
1、splice
var arr1 = ['a', 'b', 'c']; var arr2 = arr1.splice(0); console.info(arr1); arr2[1] = 'x'; console.info(arr1);
2、concat
var arr1 = ['a', 'b', 'c']; var arr2 = [].concat(arr1); console.info(arr1); arr2[1] = 'x'; console.info(arr1);
那如果是多层级的数组对象,再用上面的两个方法就有问题了
虽然最上层会创建副本,但每层下面的数据还是会引用原来的对象
对于这种情况,可以利用jquery的extend方法进行深度拷贝:
3、$.extend
var arr1 = [ { 'id': 1, 'name': 'a' }, { 'id': 2, 'name': 'b' }, { 'id': 3, 'name': 'c' } ] var arr2 = $.extend(true, {}, arr1); console.info(arr1); arr2[1].name = 'x'; console.info(arr1);
另外,$.extend也能对任何js对象创建深度拷贝,需要注意的是第一个参数要传入true,否则只是拷贝第一层属性
其实在实际开发中,$.extend还可以做的更多
宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒