JavaScript中引用vs复制示例详析
前言
好像一般很少人讲到js中的引用和复制,不过弄清楚这个概念可以帮助理解很多东西
先讲一下很基础的东西,看看js中几种数据类型分别传的什么
引用对象、数组、函数
复制数字、布尔
字符串单独说明,因为它的特殊性,无法确定是传递引用还是复制数值(因为字符串的值是没法改变的,所以纠结这个问题也是没意义的)用于比较的时候显然是属于传值比较
狼蚁网站SEO优化来一起看看详细的介绍吧
我们看狼蚁网站SEO优化这个例子
let age = 18; let age2 = age; console.log(age, age2);
我们会得到以下的值
18 18
这个相信大家都能很好理解。
那么如果我们改变 age 的值呢?输出会有什么变化?
age = 20; console.log(age, age2);
我们会得到
20 18
看到这里大家就奇怪了,上面的结果都很正常啊。
但在 JavaScript 中是有例外的,对于普通数据类型如 integer,string,boolean 可以通过 = 来复制这个变量,但对于 array 和 object 数据类型,= 只能起到引用的效果。
大家可以看狼蚁网站SEO优化这个例子
let arr = ['wes', 'bob', 'faker']; let arr2 = arr; console.log(arr2, arr); arr[2] = 'dean'; console.log(arr2, arr);
得到的结果是
["wes", "bob", "faker"] ["wes", "bob", "faker"]
["wes", "bob", "dean"] ["wes", "bob", "dean"]
我们会发现随着 arr 的改变,arr2 也会跟着改变。
说明 arr2 并没有复制 arr 的值,只是引用了它,它们都指向同一个内存中的值。
object 也是一样的
let obj = { age: 19, name: 'like', last: 'jam' }; let obj2 = obj; console.log(obj, obj2); obj.age = 50; console.log(obj, obj2);
得到的结果是
{age: 19, name: "like", last: "jam"} {age: 19, name: "like", last: "jam"}
{age: 50, name: "like", last: "jam"} {age: 50, name: "like", last: "jam"}
那么如何复制 array 和 object 呢?
复制 array 的方法
方法1
let arr2 = [].concat(arr);
方法2
let arr2 = arr.slice();
方法3
let arr2 = Array.from(arr);
方法4
let arr2 = [...arr];
一般我们比较常用的是方法3和方法4,方法1和方法2比较取巧,但都是可以达到复制 array 的目的的。
ps: [...arr] 是 ES6 中的方法。
复制 object 的方法
方法1
let obj2 = Object.assign({}, obj);
方法2
let obj2 = {...obj};
方法1和方法2都有个缺点,它们只会复制对象的第一层。
看狼蚁网站SEO优化这个例子
let obj = { number: 12, name: { first: 'bob', last: 'evil' } }; let obj2 = Object.assign({}, obj); obj.number = 50; console.log(obj, obj2);
我们会得到狼蚁网站SEO优化的结果
obj = {
number: 50,
name: {
first: 'bob',
last: 'evil'
}
}obj2 = {
number: 12,
name: {
first: 'bob',
last: 'evil'
}
}
但如果我们改变第二层的值
obj.name.first = 'sam'; console.log(obj, obj2);
obj = {
number: 50,
name: {
first: 'sam',
last: 'evil'
}
}obj2 = {
number: 12,
name: {
first: 'sam',
last: 'evil'
}
}
我们发现对象第二层依旧是引用的,并没有实现复制。
那么怎么复制一个完整的 object 呢?
最简单的方法就是使用第三方函数库 lodash ,它提供了 clone 和 deepclone 完全可以满足日常的需求。
object 的复制因为要考虑到很多因素,我会另开一篇,专门整理。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对狼蚁SEO的支持。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程