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

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日

相关文章

  • html5使用html2canvas实现浏览器截图的示例

    下面是针对“html5使用html2canvas实现浏览器截图的示例”的完整攻略: 简介 Html2canvas是一个用WebKit和canvas api将html页面渲染为canvas的javascript库。它简单易用,不需要安装其他的依赖,也能够在大部分浏览器上正常运行。本文将介绍使用Html2canvas实现浏览器截图的具体方法。 安装 可以直接在h…

    jquery 2023年5月27日
    00
  • jQWidgets jqxProgressBar showText属性

    以下是关于 jQWidgets jqxProgressBar 组件中 showText 属性的详细攻略。 jQWidgets jqxProgressBar showText 属性 jQWidgets jqxProgressBar 组件的 showText 属性用于控制是否显示进度条的文本。 语法 // 获取 showText 属性的值 var showTex…

    jquery 2023年5月12日
    00
  • BootStrap下拉菜单和滚动监听插件实现代码

    下面来详细讲解一下“Bootstrap下拉菜单和滚动监听插件实现代码”的完整攻略。 BootStrap下拉菜单实现代码 HTML部分 首先,在需要添加下拉菜单的HTML代码中,我们需要添加一个包裹dropdown组件的父元素div,并且为其添加相应的类名,具体代码如下: <div class="dropdown"> <b…

    jquery 2023年5月27日
    00
  • jQWidgets jqxChart renderEngine属性

    jQWidgets 是一个流行的 JavaScript UI 库,提供了许多可定制的 UI 组件。其中一个组件是 jqxChart,它是用于绘制图表的组件。jqxChart 提供多个属性,其中之一是 renderEngine。下面是关于 jqxChart 的 renderEngine 属性的详攻略: renderEngine 属性概述 renderEngin…

    jquery 2023年5月11日
    00
  • jQWidgets jqxTooltip refresh() 方法

    以下是关于 jQWidgets jqxTooltip 组件中 refresh() 方法的详细攻略。 jQWidgets jqxTooltip refresh() 方法 jQWidgets jqxTooltip 组件的 refresh() 方法用于刷新提示框的内容。可以使用该方法在需要的时候刷新提示框的内容。 语法 $(‘#tooltip’).jqxToolt…

    jquery 2023年5月11日
    00
  • jQWidgets jqxDocking hideAllCloseButtons() 方法

    以下是关于“jQWidgets jqxDocking hideAllCloseButtons() 方法”的完整攻略,包含两个示例说明: 方法简介 hideAllCloseButtons() 是 jQWidgets jqxDocking 控件的方法,用于隐藏所有窗口的关闭按钮。该方法的语法如下: $("#jqxDocking").jqxDo…

    jquery 2023年5月10日
    00
  • 如何使用jQuery在移动视图中隐藏一个HTML元素

    首先,在移动视图中隐藏一个HTML元素可以通过jQuery的hide()方法实现。hide()方法将元素的display属性设置为none以隐藏它。 以下是使用jQuery隐藏HTML元素的步骤: 1.将jQuery库添加至HTML文件中。例如: <script src="https://cdn.bootcdn.net/ajax/libs/j…

    jquery 2023年5月12日
    00
  • jQuery UI Tooltip位置选项

    jQuery UI Tooltip位置选项攻略 jQuery UI的Tooltip组件是一个强大的JavaScript库,它提供了许多选项和功能,以便在鼠标悬停在元素上时提示信息。以下详细攻略,含两个示例,演示如何使用Tooltip位置选项: 步骤1:引入库 在使用之,需要先中引入jQuery库和jQuery UI库。可以通过以下方式引入: <link…

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