前言 好像一般很少人讲到js中的引用和复制,不过弄清楚这个概念可以帮助理解很多东西 先讲一下很基础的东西,看看js中几种数据类型分别传的什么 引用:对象、数组、函数 复制:数字、布尔 字符串单独说明,因为它的特殊性,无法确定是传递引用还是复制数值(因为字符串的值是没法改变的,所以纠结这个问题也是没意义的)但是用于比较的时候显然是属于传值比较 下面来一起看看详细的介绍吧 首先我们看下面这个例子: let age = 18; let age2 = age; console.log(age, age2); 我们会得到以下的值: 18 18 这个相信大家都能很好理解。 那么如果我们改 在JavaScript中,了解引用与复制的概念至关重要,因为它直接影响到变量之间的关系和数据处理方式。本文将深入探讨这两种机制,特别是针对不同数据类型的处理差异。 我们要区分基本数据类型(如数字、布尔值和字符串)与复杂数据类型(如对象和数组)。在JavaScript中,基本数据类型是按值传递的,而复杂数据类型则是按引用传递。 1. **基本数据类型的复制**: 当你对基本数据类型进行赋值操作时,实际上是创建了一个新的副本。例如,`let age = 18; let age2 = age;` 这里`age2`是一个独立的值,修改`age`不会影响`age2`。当你执行`age = 20;`后,`age2`仍然是18。 2. **复杂数据类型的引用**: 对于数组和对象,赋值操作仅创建了一个新的引用,而不是一个新的副本。例如: ```javascript let arr = ['wes', 'bob', 'faker']; let arr2 = arr; arr[2] = 'dean'; ``` 在此情况下,`arr2`和`arr`都引用了同一数组,所以当`arr`改变时,`arr2`也会相应改变。 同理,对于对象: ```javascript let obj = {age: 19, name: 'like', last: 'jam'}; let obj2 = obj; obj.age = 50; ``` `obj2`和`obj`共享同一内存空间,修改`obj`的属性会影响到`obj2`。 3. **复制复杂数据类型**: - **复制数组**: - 方法1:`let arr2 = [].concat(arr);` - 方法2:`let arr2 = arr.slice();` - 方法3:`let arr2 = Array.from(arr);` - 方法4:`let arr2 = [...arr];` (ES6语法) 这些方法会创建数组的新副本,避免了原始数组的修改影响新数组。 - **复制对象**: - 方法1:`let obj2 = Object.assign({}, obj);` - 方法2:`let obj2 = {...obj};` (ES6解构赋值) 以上两种方法只复制对象的第一层,如果对象内嵌有其他对象,它们不会被深度复制。 深度复制对象需要更复杂的处理,例如使用`JSON.parse(JSON.stringify(obj))`,或者使用专门的库如lodash的`_.cloneDeep()`方法。这种方法会递归地复制对象及其所有嵌套的对象和数组。 4. **深拷贝与浅拷贝**: 浅拷贝只复制对象或数组的第一层,而深拷贝会创建一个新的对象或数组,包含原始对象或数组的所有层级的副本。在涉及嵌套对象或数组时,必须使用深拷贝来确保完全独立的副本。 理解这些基本概念有助于避免在编写JavaScript代码时遇到意外的副作用,尤其是在处理复杂的数据结构时。正确地复制和引用数据是优化代码和确保程序逻辑正确性的关键步骤。
- 粉丝: 275
- 资源: 866
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助