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 相关文章推荐
jquery ajax提交表单数据的两种方式
Nov 24 Javascript
dojo学习第一天 Tab选项卡 实现
Aug 28 Javascript
javascript中的绑定与解绑函数应用示例
Jun 24 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
Jan 13 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
Mar 12 Javascript
使用pcs api往免费的百度网盘上传下载文件的方法
Mar 17 Javascript
vue.js表格组件开发的实例详解
Oct 12 Javascript
微信小程序 template模板详解及实例
Feb 21 Javascript
利用vue.js插入dom节点的方法
Mar 15 Javascript
浅谈angular4实际项目搭建总结
Dec 01 Javascript
vue favicon设置以及动态修改favicon的方法
Dec 21 Javascript
JS实现马赛克图片效果完整示例
Apr 13 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
长波有什么东西
2021/03/01 无线电
PHP 正则表达式小结
2015/02/12 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
js将json格式内容转换成对象的方法
2013/11/01 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
2015/05/25 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
javascript实现起伏的水波背景效果
2016/05/16 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
React Native之ListView实现九宫格效果的示例
2017/08/02 Javascript
vue-cli axios请求方式及跨域处理问题
2018/03/28 Javascript
JavaScript中变量提升与函数提升经典实例分析
2018/07/26 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
2018/08/20 Javascript
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
Python单元测试框架unittest使用方法讲解
2015/04/13 Python
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
Python全局变量用法实例分析
2016/07/19 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
python2和python3在处理字符串上的区别详解
2019/05/29 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
parser.add_argument中的action使用
2020/04/20 Python
pytorch简介
2020/11/11 Python
关于webview适配H5上传照片或者视频文件的方法
2020/11/04 HTML / CSS
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
美国排名第一的葡萄酒俱乐部:Firstleaf Wine Club
2020/01/02 全球购物
中专毕业生的自我鉴定
2013/12/01 职场文书
三八红旗集体先进事迹材料
2014/05/22 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
母亲节感言
2015/08/03 职场文书
2016年“12.3”国际残疾人日活动总结
2016/04/01 职场文书
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android