时间:2021-05-26
前言
好像一般很少人讲到js中的引用和复制,不过弄清楚这个概念可以帮助理解很多东西
先讲一下很基础的东西,看看js中几种数据类型分别传的什么
引用:对象、数组、函数
复制:数字、布尔
字符串单独说明,因为它的特殊性,无法确定是传递引用还是复制数值(因为字符串的值是没法改变的,所以纠结这个问题也是没意义的)但是用于比较的时候显然是属于传值比较
下面来一起看看详细的介绍吧
首先我们看下面这个例子:
我们会得到以下的值:
18 18
这个相信大家都能很好理解。
那么如果我们改变 age 的值呢?输出会有什么变化?
我们会得到:
20 18
看到这里大家就奇怪了,上面的结果都很正常啊。
但在 JavaScript 中是有例外的,对于普通数据类型如 integer,string,boolean 可以通过 = 来复制这个变量,但对于 array 和 object 数据类型,= 只能起到引用的效果。
大家可以看下面这个例子:
得到的结果是:
["wes", "bob", "faker"] ["wes", "bob", "faker"]
["wes", "bob", "dean"] ["wes", "bob", "dean"]
我们会发现随着 arr 的改变,arr2 也会跟着改变。
说明 arr2 并没有复制 arr 的值,只是引用了它,它们都指向同一个内存中的值。
object 也是一样的:
得到的结果是:
{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:
方法2:
方法3:
方法4:
一般我们比较常用的是方法3和方法4,方法1和方法2比较取巧,但都是可以达到复制 array 的目的的。
ps: [...arr] 是 ES6 中的方法。
复制 object 的方法:
方法1:
方法2:
方法1和方法2都有个缺点,它们只会复制对象的第一层。
看下面这个例子:
我们会得到下面的结果:
obj = {
number: 50,
name: {
first: 'bob',
last: 'evil'
}
}
obj2 = {
number: 12,
name: {
first: 'bob',
last: 'evil'
}
}
但如果我们改变第二层的值:
obj = {
number: 50,
name: {
first: 'sam',
last: 'evil'
}
}
obj2 = {
number: 12,
name: {
first: 'sam',
last: 'evil'
}
}
我们发现对象第二层依旧是引用的,并没有实现复制。
那么怎么复制一个完整的 object 呢?
最简单的方法就是使用第三方函数库 lodash ,它提供了 clone 和 deepclone 完全可以满足日常的需求。
object 的复制因为要考虑到很多因素,我会另开一篇,专门整理。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
1.延时脚本运行的方法:方法一:把全部javascript引用放在元素中,页面内容后,如复制代码代码如下:示例1方法二:为元素定义defer属性defer="d
在Javascript脚本中,参数的引用原则:引用的参数内部(如属性)可以修改,但参数对应的引用(reference)不能修改。一个测试例子如下:复制代码代码如
上篇文章给大家介绍了Vue实现点击按钮复制文本内容的例子,喜欢的朋友可以点击查看,今天给大家分享VUE页面中通过双击实现复制表格中内容,通过示例代码讲解的非常详
Javascript代码如下,将该代码保存成JS文件后在HTML中引用。复制代码代码如下:jQuery.noConflict();jQuery.fn.exten
16.类和结构的区别?答:类:类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存类有构造和析构函数类可以继承和被继承结构:结