JavaScript复制变量三种方法实例详解


Posted in Javascript onJanuary 09, 2020

这篇文章主要介绍了JavaScript复制变量三种方法实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

直接将一个变量赋给另一个变量时,系统并不会创造一个新的变量,而是将原变量的地址赋给了新变量名。举个栗子:
复制代码
复制代码
let obj = {
a: 1,
b: 2,
};
let copy = obj;

obj.a = 5;
console.log(copy.a);
// Result
// a = 5; // 更改obj的值,copy变量的值也会改变
复制代码
复制代码
文章中提到了很多种办法,本文只选择了三种普遍的用法并分析了各自的优缺点,以及什么情况下使用哪种是最好的。

1. 原生方法解决
最简单的办法就是一个一个循环复制给新的变量。举栗:

复制代码
复制代码
function copy(mainObj) {
let objCopy = {}; // objCopy will store a copy of the mainObj
let key;

for (key in mainObj) {
objCopy[key] = mainObj[key]; // copies each property to the objCopy object
}
return objCopy;
}

const mainObj = {
a: 2,
b: 5,
c: {
x: 7,
y: 4,
},
}

console.log(copy(mainObj));
复制代码
复制代码
缺点:

1. objCopy 的Object.prototype 方法与mainObj 会不一样,通常情况下我们需要完全一样的副本时,这个办法并不适用。

2. 麻烦而且费时费事,代码无法重用。

3. 如果原来的变量中包含Object类型,复制时还是会把这个子变量的索引交给新的变量,并不是创建了新的副本。

2. 深度复制
利用JSON转换来复制变量。先将原先的变量转换为String然后再重新组装成JSON,这样会产生一个不一样的副本。

复制代码
复制代码
let obj = {
a: 1,
b: {
c: 2,
},
}

let newObj = JSON.parse(JSON.stringify(obj));

obj.b.c = 20;
console.log(obj); // { a: 1, b: { c: 20 } }
console.log(newObj); // { a: 1, b: { c: 2 } } (New Object Intact!)
复制代码
复制代码
缺点:

1. 变量很多的时候非常耗时耗内存。

3. 使用Object.assign()
使用举例:

复制代码
复制代码
// circular object
let obj = {
a: 'a',
b: {
c: 'c',
d: 'd',
},
}

obj.c = obj.b;
obj.e = obj.a;
obj.b.c = obj.c;
obj.b.d = obj.b;
obj.b.e = obj.b.c;

let newObj2 = Object.assign({}, obj);

console.log(newObj2);
复制代码
复制代码
可以把它封装成一个方法:

复制代码
// 封装成方法
// 返回一个新的变量副本
// get a copy of an object
function getNewObjectOf(src) {
return Object.assign({}, src);
}
复制代码
缺点:

1. 这个也是浅复制(仅复制顶层的属性,底层属性并不复制)。深层属性会同样返回索引,与原变量分享一个地址。(看下面栗子)

复制代码
复制代码
let obj = {
a: 1,
b: {
c: 2,
},
}
let newObj = Object.assign({}, obj);
console.log(newObj); // { a: 1, b: { c: 2} }

obj.a = 10;
console.log(obj); // { a: 10, b: { c: 2} }
console.log(newObj); // { a: 1, b: { c: 2} }

newObj.a = 20;
console.log(obj); // { a: 10, b: { c: 2} }
console.log(newObj); // { a: 20, b: { c: 2} }

newObj.b.c = 30;
console.log(obj); // { a: 10, b: { c: 30} }
console.log(newObj); // { a: 20, b: { c: 30} }

// 注意: 所有变量 的 *。b.c 都等于30; 原因看上面解释。
复制代码
复制代码

结论:
原文中还有很多其他的办法,但此文仅摘抄出最有用的几个。一般不会用到第一种办法,如需要复制的变量有很多层的话,需要用第二种办法来复制,如果变量仅仅包含一层(如json格式的配置信息变量),第三种是最高效的。

再次给出封装好的方法:

// 封装成方法// 返回一个新的变量副本
// get a copy of an object
function getNewObjectOf(src) {
 return Object.assign({}, src);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
IE不出现Flash激活框的小发现的js实现方法
Sep 07 Javascript
EXT中xtype的含义分析
Jan 07 Javascript
Jquery CheckBox全选方法代码附js checkbox全选反选代码
Jun 09 Javascript
一个不错的js html页面倒计时可精确到秒
Oct 22 Javascript
jQuery中next方法用法实例
Apr 24 Javascript
微信小程序 sha1 实现密码加密实例详解
Jul 06 Javascript
微信小程序之分享页面如何返回首页的示例
Mar 28 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
Jun 08 Javascript
vue打包相关细节整理(小结)
Sep 28 Javascript
ES6 Proxy实现Vue的变化检测问题
Jun 11 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
Aug 20 Javascript
彻底搞懂并解决vue-cli4中图片显示的问题实现
Aug 31 Javascript
js实现左右轮播图
Jan 09 #Javascript
Vue-axios-post数据后端接不到问题解决
Jan 09 #Javascript
一看就会的vuex实现登录验证(附案例)
Jan 09 #Javascript
Websocket 向指定用户发消息的方法
Jan 09 #Javascript
Vue快速实现通用表单验证的示例代码
Jan 09 #Javascript
JS实现商品橱窗特效
Jan 09 #Javascript
微信小程序实现页面浮动导航
Jan 08 #Javascript
You might like
PHP程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
Zend的AutoLoad机制介绍
2012/09/27 PHP
解析php框架codeigniter中如何使用框架的session
2013/06/24 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
Javascript & DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
jquery插件之easing使用
2010/08/19 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
Node.js 8 中的重要新特性
2017/06/28 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
[48:27]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
Python使用smtp和pop简单收发邮件完整实例
2018/01/09 Python
python操作excel的方法
2018/08/16 Python
python如何读取bin文件并下发串口
2019/07/05 Python
python实现俄罗斯方块小游戏
2020/04/24 Python
HTML5 canvas基本绘图之绘制阴影效果
2016/06/27 HTML / CSS
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
音乐器材管理制度
2014/01/31 职场文书
党员批评与自我批评
2014/02/12 职场文书
工商企业管理专业自荐信范文
2014/04/12 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
青年文明号汇报材料
2014/12/23 职场文书
傅雷家书读书笔记
2015/06/29 职场文书
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript
JAVA API 实用类 String详解
2021/10/05 Java/Android
SQL CASE 表达式的具体使用
2022/03/21 SQL Server
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers