jQuery的$.extend 浅拷贝与深拷贝

yizhihongxing

jQuery的$.extend 浅拷贝与深拷贝

什么是$.extend?

$.extend 是 jQuery 中一个非常常用的方法,它可以将两个或多个对象合并到第一个对象中,而且是浅拷贝的。它的语法如下:

$.extend([deep ], target, object1 [, objectN ])
  • first 参数 deep:可选。如果设为 true,合并操作 recursively(即深拷贝)。
  • second 参数 target: 必选。目标对象,其他对象的属性将被附加到该对象上。需要合并到此对象的其他对象参数 1 、参数 2 ,……参数 N 。
  • third 参数 object1:必选。第一个被合并的对象。
  • fourth 参数 objectN:可选。第 N 个被合并的对象。

使用 $.extend 实现浅拷贝,目标对象和被合并的对象属性完全一致,如:

let target = {a:2};
const source = {a:3, b:4};
$.extend(target, source);
console.log(target);  // {a:3, b:4}

但是对于含有对象或数组的属性,浅拷贝只是拷贝对象或数组的引用,没有真正生成新的对象或数组。示例代码如下:

let target = {lists: [1, 2, 3]};
const source = {lists: [4, 5, 6]};
$.extend(target, source);
console.log(target); // {lists: [4, 5, 6]}

深拷贝

深拷贝是在拷贝对象时,同时新建对象的引用,而不是仅仅拷贝一个指针,所以可以达到拷贝后对象不会互相影响的效果。jQuery 的 extend 方法默认是浅拷贝,如果需要用其实现深拷贝操作时,就要通过以下方法来实现。

方式一: 递归调用

使用递归函数,实现深拷贝,示例代码如下:

function deepCopy(obj) {
  if (obj === null || typeof obj !== "object") {
    return obj;
  }
  const copy = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      copy[key] = deepCopy(obj[key]);
    }
  }
  return copy;
}

let obj = { aa: { bb: "cc" } };
let newObj = deepCopy(obj);
console.log(obj.aa.bb); // 'cc'
newObj.aa.bb = "dd";
console.log(obj.aa.bb); // 'cc'

方式二: JSON序列化和反序列化

JSON.parse() 和 JSON.stringify() 分别可以实现将对象序列化成字符串、从字符串中解析出对象,从而达到深拷贝的目的,示例代码如下:

let obj = { aa: { bb: "cc" } };
let newObj = JSON.parse(JSON.stringify(obj));
console.log(obj.aa.bb); // 'cc'
newObj.aa.bb = "dd";
console.log(obj.aa.bb); // 'cc'

需要注意的是,使用 JSON.parse() 和 JSON.stringify() 进行深拷贝,也有几个限制:
- 无法拷贝函数;
- 无法拷贝 null 和 undefined 类型的值;
- 无法拷贝正则表达式。

总结

jQuery 的 $.extend() 默认的拷贝方式是浅拷贝,只拷贝对象的引用,导致可能生成无法独立改变的拷贝数据,要实现深拷贝操作可以采用递归或者 JSON.parse+JSON.stringify 方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jQuery的$.extend 浅拷贝与深拷贝 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • EasyUI jQuery fileBbox widget

    EasyUI是一款基于jQuery实现的UI框架,其中fileBox就是一种可以用于上传文件的UI组件。在EasyUI中,jQuery fileBox widget提供了一些使用和扩展的方法,使得它能够满足更多的需求。 下面是使用EasyUI jQuery fileBbox widget的完整攻略: 前置条件 在使用EasyUI的jQuery fileBox…

    jquery 2023年5月13日
    00
  • 如何在jQuery.each()函数中跳到下一个迭代

    在 jQuery 的 each() 函数中想要跳到下一个迭代,一般情况下可以使用 continue 关键字来实现。关于如何在 jQuery.each() 函数中跳到下一个迭代,可以按照以下步骤操作: 在 each() 函数中通过回调函数来执行需要循环的代码 $.each(array, function(index, value) { // 待执行的代码 })…

    jquery 2023年5月12日
    00
  • jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理

    首先,本文将深入讲解jQuery 1.9.1源码中事件系统的主动触发事件和模拟冒泡处理的实现原理。在介绍过程中,将会涉及到代码实现以及示例说明。 事件系统之主动触发事件 jQuery中的事件处理机制是基于DOM Level 2的,而DOM Level 2规范中明确规定“任何事件都可以通过调用dispatchEvent()方法手动触发”。基于这个规范,jQue…

    jquery 2023年5月18日
    00
  • jQWidgets jqxSortable 创建事件

    jQWidgets是一个jQuery插件集,提供了一系列实用的UI组件,包括jqxSortable。 jqxSortable是一个jQuery插件,用于在Web页面中实现可拖放排序。 在使用jqxSortable时,可以给它绑定一个create事件,该事件会在创建jqxSortable实例的时候触发。这个事件不接收任何参数。 使用示例: $("#s…

    jquery 2023年5月12日
    00
  • jQuery :submit 选择器

    以下是关于jQuery :submit选择器的完整攻略: 什么是:submit选择器? :submit选择器是jQuery中一种选择器,用于选择所有类型为提交按钮的元素。 如何使用:submit选择器? 可以使用以下代码选择所有类型为提交按钮的元素: $(":submit") 这个代码中,:submit选择所有类型为提交按钮的元素。 示例…

    jquery 2023年5月12日
    00
  • jQWidgets jqxTooltip opacity 属性

    以下是关于 jQWidgets jqxTooltip 组件中 opacity 属性的详细攻略。 jQWidgets jqxTooltip opacity 属性 jQWidgets jqxTooltip 组件的 opacity 属性用于设置提示框的透明度。可以使用该属性控制提示框的透明度。 语法 $(‘#tooltip’).jqxTooltip({ opaci…

    jquery 2023年5月11日
    00
  • jQWidgets jqxGrid showpinnedcolumnbackground属性

    jQWidgets jqxGrid showpinnedcolumnbackground属性 jQWidgets jqxGrid 是一种表格控件,用于在 Web 应用程序中创建表格。showpinnedcolumnbackground 属性是 jqxGrid 控件的一个属性,用于指定是否显示固定列的背景色。本文将详细讲解 showpinnedcolumnba…

    jquery 2023年5月10日
    00
  • jQWidgets jqxGrid selectrow()方法

    以下是关于“jQWidgets jqxGrid selectrow()方法”的完整攻略,包含两个示例说明: 方法简介 selectrow() 方法是 jQWidgets jqxGrid 控件的一个方法,用于选中指定行。该方法的语法如下: $("#jqxGrid").jqxGrid(‘selectrow’, rowindex); 在上述语法…

    jquery 2023年5月10日
    00
合作推广
合作推广
分享本页
返回顶部