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 相关文章推荐
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
Mar 10 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
May 17 Javascript
JavaScript面对国际化编程时的一些建议
Jun 24 Javascript
js淡入淡出焦点图幻灯片效果代码分享
Sep 08 Javascript
jquery判断类型是不是number类型的实例代码
Oct 07 Javascript
bootstrap table复杂操作代码
Nov 01 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
Jan 19 Javascript
微信小程序之picker日期和时间选择器
Feb 09 Javascript
详解Vue中一种简易路由传参办法
Sep 15 Javascript
解读vue生成的文件目录结构及说明
Nov 27 Javascript
微信小程序实现动态获取元素宽高的方法分析
Dec 10 Javascript
浅谈js中的bind
Mar 18 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
jQuery+PHP+ajax实现微博加载更多内容列表功能
2014/06/27 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
2015/01/22 PHP
WordPress中缩略图的使用以及相关技巧
2015/11/24 PHP
PHP加密解密实例分析
2015/12/25 PHP
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
JavaScript获取客户端计算机硬件及系统等信息的方法
2014/01/02 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
JavaScript中的迭代器和生成器详解
2014/10/29 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
jquery代码规范让代码越来越好看
2017/02/03 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
2017/09/07 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
axios对请求各种异常情况处理的封装方法
2018/09/25 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
layui 弹出层回调获取弹出层数据的例子
2019/09/02 Javascript
javascript实现倒计时关闭广告
2021/02/09 Javascript
Python利用带权重随机数解决抽奖和游戏爆装备问题
2016/06/16 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
2020/06/23 Python
用Django写天气预报查询网站
2018/10/21 Python
Python画图实现同一结点多个柱状图的示例
2019/07/07 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
基于python判断字符串括号是否闭合{}[]()
2020/09/21 Python
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
The North Face官方旗舰店:美国著名户外品牌
2020/09/28 全球购物
校运会入场式解说词
2014/02/10 职场文书
2014国庆节标语口号
2014/09/19 职场文书
群众路线四风问题整改措施
2014/09/27 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
实习推荐信格式模板
2015/03/27 职场文书
幼儿园教师教学反思
2016/03/02 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电