数组,对象的合并和复制

深拷贝:开辟一个新的内存地址,浅拷贝指针指向同一片内存空间

浅复制只复制一层对象的属性,而深复制则递归复制了所有层级

浅拷贝(合并)的实现

1.遍历赋值

var obj = { a:1, arr: [2,3] };
var shallowObj = shallowCopy(obj);

function shallowCopy(src) {
    if(typeof src !== 'object') return
    var dst= Array.isArray(src) ? [] : {}
     for ( var prop in src) {
        if (src.hasOwnProperty(prop) {  //此处hasOwnProperty是判断自有属性,使用 for in 循环遍历对象的属性时,原型链上的所有属性都将被访问会避免原型对象扩展带来的干扰
            dst[prop] = src[prop]
        }
    }
    return dst
}

2.Object.assign()   可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。【// 如果数组元素是基本类型,就会拷贝一份,互不影响,而如果是对象或者数组,就会只拷贝对象和数组的引用,这样我们无论在新旧数组进行了修改,两者都会发生变化。这种叫浅拷贝】

var x = {
  a: 1,
  b: { f: { g: 1 } },
  c: [ 1, 2, 3 ]
};
var y = Object.assign({}, x);
console.log(y.b.f === x.b.f);     // true

合并对象 Object.assign()

如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };

const returnedTarget = Object.assign(target, source);

console.log(target);
// expected output: Object { a: 1, b: 4, c: 5 }

3.$.extend()

var obj1={'a':1};
var obj2={'b':{'b1':22,'b2':33}};

$.extend(obj1, obj2);   //obj1拷贝了obj2的属性

console.log(obj1)  // {'a':1,'b'{'b1':22,'b2':33}}
console.log(obj1.b.b1)  // 22

obj2.b.b1=44;   //obj2重新赋值
console.log(obj1.b.b1)  // 44  obj1.b仅拷贝了对象的指引,所以受原obj2的影响

深拷贝的实现 

var obj1={'a':1};
var obj2={'b':{'b1':22,'b2':33}};

$.extend(true,obj1, obj2);   //第一个参数设为true表示深复制

console.log(obj1)  // {'a':1,'b'{'b1':22,'b2':33}}
console.log(obj1.b.b1)  // 22

obj2.b.b1=44;   //obj2重新赋值
console.log(obj1.b.b1)  

数组的合并

concat方法用于多个数组的合并。它将新数组的成员,添加到原数组成员的后部,然后返回一个新数组,原数组不变。 // 如果数组元素是基本类型,就会拷贝一份,互不影响,而如果是对象或者数组,就会只拷贝对象和数组的引用,这样我们无论在新旧数组进行了修改,两者都会发生变化。这种叫浅拷贝

  const a = [1, 2, 3]
  const b = [4, 5, 6]
  const c = a.concat(b)
  c[0] = 9
 console.log(c)  // [ 9, 2, 3, 4, 5, 6 ]
  console.log(a) //[1,2,3]  //数组不是引用型则为深拷贝

如果数组成员包括对象,concat方法返回当前数组的一个浅拷贝。所谓“浅拷贝”,指的是新数组拷贝的是对象的引用。

var obj = { a: 1 };
var oldArray = [obj];

var newArray = oldArray.concat();

obj.a = 2;
newArray[0].a // 2

slice方法 // 如果数组元素是基本类型,就会拷贝一份,互不影响,而如果是对象或者数组,就会只拷贝对象和数组的引用,这样我们无论在新旧数组进行了修改,两者都会发生变化。这种叫浅拷贝

slice 方法实现数组的拷贝

  slice() 方法可从已有的数组中返回选定的元素。

  arrayObject.slice(start,end)

  该方法返回一个新的数组,包含从 start 到 end (不包括该元素,数学上来讲是左闭右开,即包含左,不含右)的 arrayObject 中的元素。

 
  1. 1 var arr1 = [1, 2, 3];

  2. 2 var arr2 = arr1.slice(0);

  3. 3 arr1[0] = 4;

  4. 4 console.log(arr1); //4, 2, 3

  5. 5 console.log(arr2); //1, 2, 3

 for循环

var a = [ ] for (var i in b) { a.push(b[i]) }

  • …扩展运算符
  • const a1 = [1, 2];
    // 写法一
    const a2 = [...a1];
    // 写法二
    const [...a2] = a1;
    
    // ES6 的合并数组
    [...arr1, ...arr2, ...arr3]

递归实现深拷贝

function deepClone(obj) {
 if (typeof obj !== 'object') return;
    let objClone = Array.isArray(obj) ? []:{}
        for (key in obj) {
            if(obj.hasOwnObjectProperty(key)) {
             objClone[key] = typeof obj[key] === "object" ? deepClone(obj[key]) : obj[key]
        }
}

JSON对象的parse和stringify实现深拷贝

function deepClone(obj){
    let _obj = JSON.stringify(obj),
        objClone = JSON.parse(_obj);
    return objClone
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript中数组对象都有一些常用的方法。 1. 数组方法: - Array.unshift(): 将一个或多个元素添加到数组的开头,并返回数组。这会改变数组的长度。 - Array.isArray(): 用来判断一个对象是否为数组。如果是数组则返回true,否则返回false。 - Array.push(): 将一个或多个元素添加到数组的末尾,并返回新的数组长度。 - Array.pop(): 删除数组的最后一个元素,并返回被删除的元素。这会改变数组的长度。 - Array.shift(): 删除数组的第一个元素,并返回被删除的元素。这会改变数组的长度。 - Array.concat(): 将多个数组合并成一个新的数组。 - Array.toString(): 将数组转换为字符串形式。 - Array.join(): 将数组转换为字符串形式,可以设置元素之间的间隔。 - Array.splice(start, deleteCount, item): 在指定位置对数组进行增、删、改操作。可以删除数组中的元素、添加新的元素或替换数组中的元素。 - Array.slice(start, end): 返回指定起始下标到结束下标之间的子数组,原数组不受影响。 2. 对象方法: - Object.keys(): 返回一个由对象的所有可枚举属性组成的数组。 - Object.values(): 返回一个由对象的所有可枚举属性值组成的数组。 - Object.entries(): 返回一个由对象的所有可枚举属性键值对组成的数组。 - Object.assign(target, ...sources): 用于将一个或多个源对象的所有可枚举属性复制到目标对象。 以上是一些常用的数组对象方法,可以根据需要选择合适的方法进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [常用js数组方法和对象方法](https://blog.csdn.net/qq_44890872/article/details/103324937)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值