美文网首页
js的深浅拷贝

js的深浅拷贝

作者: 码老二 | 来源:发表于2017-09-27 16:03 被阅读0次

js的深浅拷贝可以分为数组的深浅拷贝和对象的深浅拷贝

一、数组的深浅拷贝
如果只是简单的将数组中的元素付给另外一个数组,那么只要新数组中的元素发生了改变,原数组中的元素也会相应的发生改变,因为如果只是简单的赋值,那么它只是对引用了元素的地址,并非真正意义上的拷贝,这种称之为浅拷贝。
例如:

var arr = ['张三','李四','王五'];
var newArr = arr;

newArr[1] = '赵四';

console.log(arr);    // ==> ['张三','赵四','王五']
console.log(newArr);    // ==> ['张三','赵四','王五']

但是我们在应用中往往不希望原数组的元素也被修改,那么就需要深拷贝来解决这个问题。
有两种方法:
1、js的slice()方法
slice()slice() 方法可从已有的数组中返回选定的元素.
语法:arrayObject.slice(start,end);
start:必选。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
end:可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。
返回值:返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。

var arr = ['张三','李四','王五'];
var newArr = arr.slice(0);

newArr[1] = '赵四';

console.log(arr);    // ==> ['张三','李四','王五']
console.log(newArr);    // ==> ['张三','赵四','王五']

2、js的contat()方法
concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
语法:arrayObject.concat(arrayX,arrayX,arrayX......)
返回值:返回一个新的数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。

var a = [1,2,3];
console.log(a.concat(4,5));    // ===>[1,2,3,4,5]

var newArr = [4,5];
console.log(arr.concat(newArr));   //===>[1,2,3,4,5]
var arr = ['张三','李四','王五'];
var newArr = arr.concat();

newArr[1] = '赵四';

console.log(arr);    // ==> ['张三','李四','王五']
console.log(newArr);    // ==> ['张三','赵四','王五']

二、对象的深浅拷贝
例如:

var obj = {
    'name' : 'zhangsan',
    'hobby' : ['sport','singing','reading']
}
function copy(obj1) {
  var obj2 = new Object();
  for (var i in obj1) {
    obj2[i] = obj1[i];
  }
  return obj2;
}
var newObj = copy(obj);
obj.hobby.push('hiking');
console.log(obj.hobby);  // ['sport','singing','reading','hiking']
console.log(newObj.hobby)  // ['sport','singing','reading','hiking']

可见浅拷贝只是对原对象进行了数据的应用,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。(对象中存在数组的时候)

function deepCopy(obj1, obj2) {
      var obj2 = obj2 || {};
        for (var i in obj1) {
          if (typeof obj1[i] === 'object') {
            obj2[i] = (obj1[i].constructor === Array) ? [] : {};
            deepCopy(obj1[i], obj2[i]);
          } else {
             obj2[i] = obj1[i];
          }
  }
  return obj2;
}

var obj = {
    'name' : 'zhangsan',
    'hobby' : ['sport','singing','reading'],
    'friends' : ['lisi','wangwu']
}

var newObj = new Object();
deepCopy(obj,newObj);
obj.hobby.push('hiling');

console.log(newObj);
console.log(obj);

相关文章

  • JS文集的目录

    js基础心法 深浅拷贝(递归)深浅拷贝(首层浅拷贝) js 数据处理 数组对象查找的常见操作数组对象去重的常见操作...

  • js的深浅拷贝

    js的深浅拷贝可以分为数组的深浅拷贝和对象的深浅拷贝 一、数组的深浅拷贝如果只是简单的将数组中的元素付给另外一个数...

  • js深浅拷贝

    项目中,一般会用loadsh库,地址:https://github.com/lodash/lodash 浅拷贝方法...

  • js 深浅拷贝

    浅拷贝 是 把对象或者数组的第一层 key 或者 索引 赋到 新的 对象或者对象上 深拷贝是迭代浅拷贝的操作,也就...

  • js 深浅拷贝

    深拷贝 更好的写法: 浅拷贝 浅拷贝,还可以用 Object.assign 、展开运算符 ...

  • JS深浅拷贝

  • JS深浅拷贝

    JS存储方式 JS中存在基本数据类型和引用数据类型1.基本数据类型:number,string,boolean,n...

  • JS深浅拷贝

    浅拷贝 浅拷贝的意思就是只复制引用,而未复制真正的值。 深拷贝 深拷贝就是对目标的完全拷贝,不像浅拷贝那样只是复制...

  • JS 深浅拷贝

    START 番茄我又又又来写点啥啦。 最近敲代码,总是遇到需要修改数据,在前端展示。但是最后并不想修改原数据的情况...

  • JS 深浅拷贝

    https://blog.csdn.net/flyingpig2016/article/details/52895620

网友评论

      本文标题:js的深浅拷贝

      本文链接:https://www.haomeiwen.com/subject/smsuextx.html