JavaScript中引用vs复制示例详析


Posted in Javascript onDecember 06, 2018

前言

好像一般很少人讲到js中的引用和复制,不过弄清楚这个概念可以帮助理解很多东西

先讲一下很基础的东西,看看js中几种数据类型分别传的什么

引用:对象、数组、函数

复制:数字、布尔

字符串单独说明,因为它的特殊性,无法确定是传递引用还是复制数值(因为字符串的值是没法改变的,所以纠结这个问题也是没意义的)但是用于比较的时候显然是属于传值比较

下面来一起看看详细的介绍吧

首先我们看下面这个例子:

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 数据类型,= 只能起到引用的效果。

大家可以看下面这个例子:

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都有个缺点,它们只会复制对象的第一层。

看下面这个例子:

let obj = {
 number: 12,
 name: {
  first: 'bob',
  last: 'evil'
 }
};
let obj2 = Object.assign({}, obj);
obj.number = 50;
console.log(obj, obj2);

我们会得到下面的结果:

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 的复制因为要考虑到很多因素,我会另开一篇,专门整理。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript prototype属性使用说明
May 13 Javascript
不提示直接关闭网页窗口的JS示例代码
Dec 17 Javascript
Javascript 数组排序详解
Oct 22 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
Feb 13 Javascript
js实现同一个页面多个渐变效果的方法
Apr 10 Javascript
jquery实现的3D旋转木马特效代码分享
Aug 25 Javascript
JS获取文件大小方法小结
Dec 08 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
Mar 21 Javascript
vue实现表格增删改查效果的实例代码
Jul 18 Javascript
原生js实现日历效果
Mar 02 Javascript
基于Vue实现微前端的示例代码
Apr 24 Javascript
JavaScript实现猜数字游戏
May 20 Javascript
使用jQuery动态设置单选框的选中效果
Dec 06 #jQuery
express+vue+mongodb+session 实现注册登录功能
Dec 06 #Javascript
如何使用puppet替换文件中的string
Dec 06 #Javascript
详解vantUI框架在vue项目中的应用踩坑
Dec 06 #Javascript
基于element-ui组件手动实现单选和上传功能
Dec 06 #Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
Dec 05 #Javascript
在Vant的基础上实现添加表单验证框架的方法示例
Dec 05 #Javascript
You might like
浅析PHP中Session可能会引起并发问题
2015/07/23 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
2020/05/29 PHP
Thinkphp5框架异常处理操作实例分析
2020/06/03 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
js改变css样式的三种方法推荐
2016/06/28 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
2016/12/26 Javascript
WdatePicker.js时间日期插件的使用方法
2017/07/26 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
ligerUI的ligerDialog关闭刷新的方法
2019/09/27 Javascript
NodeJS http模块用法示例【创建web服务器/客户端】
2019/11/05 NodeJs
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
Vue3.0的优化总结
2020/10/16 Javascript
Python获取当前时间的方法
2014/01/14 Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
2019/07/30 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
2020/07/14 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
英国领先的奢侈品零售商之一:CRUISE
2016/12/02 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
vue实现倒计时功能
2021/03/24 Vue.js
保送生自荐信范文
2013/10/06 职场文书
工作个人的自我评价
2014/01/14 职场文书
中学生自我鉴定
2014/02/04 职场文书
如何写自我评价?自我评价写什么好?
2014/03/14 职场文书
广告词串烧
2014/03/19 职场文书
酒店周年庆活动方案
2014/08/21 职场文书