JavaScript 指针
在像 C++ 这样的编程语言中,我们经常初始化指针以获取内容位置。但是在 JavaScript 的情况下,我们没有直接指向地址的约定。
在 JavaScript 中,我们有两种数据类型,一种是原始数据类型,另一种是复合数据类型。
通常,原始数据类型遵循以维护按值传递
。复合数据类型允许按引用传递
;这就是浅拷贝
的工作原理。
对象的浅拷贝获取目标对象的引用,所做的任何修改都会影响原始对象和副本。
在这里,我们将看到按值传递
和按引用传递
的工作原理。我们还将尝试制作复合对象的深拷贝
。
具体来说,我们将使用 lodash
、JSON.parse 和 JSON.stringify
、slice()
、Object.assign()
功能介绍 spread operator
。
在 JavaScript 中传递原始对象的值
在处理原始对象时,会维护目标对象的一般副本。并且在这个驱动器中,即使对副本进行任何修改,原始对象也不会受到影响。
这个过程以 pass by value
命名,默认执行 deep copy
。
var x = 7;
var y = x;
x = 42;
console.log(x);
console.log(y);
输出:
对象 y
的修改不会影响 x
对象。
JavaScript 中复合对象的引用传递
在复合对象的情况下,引用作为副本传递。因此,对复制对象所做的任何修改都会影响原始对象。
这种方法也称为浅拷贝
或按引用传递
。
var x = {num: 42};
var y = x;
y.num = 7;
console.log(x.num);
console.log(y.num);
输出:
在这里,我们有一个对象 y
,它获取 x
的副本。但内部图片仅使用对象 x
引用。
因此,当我们更改副本中的内容时,效果将在原始对象上,因为这里的两个对象都指向同一个引用。
为了解决这种浅拷贝的情况,我们有一些命题和工作,不管对象类型(数组或对象)或需要单独注意。
例如,spread operator
适用于数组和对象中的 deep copy
。让我们按照以下部分进行清晰的查看。
在 JavaScript 中使用 Spread Operator
进行深度复制
传播运算符是将一个对象传播到另一个对象的约定。这种复制方法是准确的,任何修改都会使对象保持完整或应该被更改。
同样,展开运算符适用于数组和对象。让我们检查以下实例。
var x = [1, 2, 3];
var y = [...x];
y[2] = 5;
console.log(x[2]);
console.log(y[2]);
输出:
对嵌套对象使用扩展运算符会很乏味,因为你必须访问每个级别的键
。在这种情况下,更简单的解决方案是使用即将推出的方法。
使用 JSON.parse()
和 JSON.stringify()
进行对象的深层复制
每当我们使用一个对象时,我们都会访问触发 keys
的内容。JSON.parse(JSON.stringify(Object))
使艰苦的工作变得更好。
它对目标对象进行深拷贝,我们还可以修改内容。
var json = {num: {val: 7}};
var collect = JSON.parse(JSON.stringify(json));
collect.num.val = 42;
console.log(json.num.val);
console.log(collect.num.val);
输出:
在 JavaScript 中使用 Object.assign()
进行对象的深层复制
Object.assign()
方法制作原始对象的准确副本。
以这种方式解决问题,我们需要 2 个参数;一个是一对空白花括号 {}
,后跟目标对象。让我们检查实例以获得更好的理解。
var x = {'food': 'cheese', 'sport': 'badminton'};
var y = Object.assign({}, x);
y.food = 'chocolate';
console.log(x.food);
console.log(y.food);
输出:
在 JavaScript 中使用 Object.slice(0)
进行数组的深度复制
没有任何参数或零的方法 slice()
启动可以进行深层复制。这是处理数组的熟悉且最常用的方法之一。
除此之外,你还可以使用 map
复制数组。检查此文档以进行进一步查询。
这些示例将更具说明性。
var x = [1, 3, 4];
var y = x.slice(0);
y[2] = 5;
console.log(x);
console.log(y);
输出:
在 JavaScript 中使用 lodash
进行深度克隆
要使用此解决方案,你需要加载 lodash 4.x
库。我们已经检查了 jsbin 编辑器中的示例。
在这里,你将在库部分找到 lodash 4.x
。
var x = [1, 2, 3];
var y = _.cloneDeep(x);
y[1] = 4;
console.log(y[1]);
console.log(x[1]);
输出:
相关文章
Do you understand JavaScript closures?
发布时间:2025/02/21 浏览次数:108 分类:JavaScript
-
The function of a closure can be inferred from its name, suggesting that it is related to the concept of scope. A closure itself is a core concept in JavaScript, and being a core concept, it is naturally also a difficult one.
Do you know about the hidden traps in variables in JavaScript?
发布时间:2025/02/21 浏览次数:178 分类:JavaScript
-
Whether you're just starting to learn JavaScript or have been using it for a long time, I believe you'll encounter some traps related to JavaScript variable scope. The goal is to identify these traps before you fall into them, in order to av
How much do you know about the Prototype Chain?
发布时间:2025/02/21 浏览次数:150 分类:JavaScript
-
The prototype chain can be considered one of the core features of JavaScript, and certainly one of its more challenging aspects. If you've learned other object-oriented programming languages, you may find it somewhat confusing when you start
用 jQuery 检查复选框是否被选中
发布时间:2024/03/24 浏览次数:102 分类:JavaScript
-
在本教程中学习 jQuery 检查复选框是否被选中的所有很酷的方法。我们展示了使用直接 DOM 操作、提取 JavaScript 属性的 jQuery 方法以及使用 jQuery 选择器的不同方法。你还将找到许多有用的
jQuery 中的 Window.onload 与 $(document).ready
发布时间:2024/03/24 浏览次数:180 分类:JavaScript
-
本教程演示了如何在 jQuery 中使用 Window.onload 和 $(document).ready 事件。