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

 更新时间:2020年01月09日 14:44:43   作者:戈博折刀  
这篇文章主要介绍了JavaScript复制变量三种方法实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了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中字符串的字符之间添加空格

    如何轻松在JavaScript中字符串的字符之间添加空格

    在前端开发的过程中,我们经常会遇到需要对于输入的字符串进行格式化处理,下面这篇文章主要给大家介绍了关于如何轻松在JavaScript中字符串的字符之间添加空格的相关资料,需要的朋友可以参考下
    2023-03-03
  • 使用JavaScript实现node.js中的path.join方法

    使用JavaScript实现node.js中的path.join方法

    Node.JS中的 path.join 非常方便,能直接按相对或绝对合并路径,有时侯前端也需要这种方法,如何实现呢?感兴趣的朋友跟随脚本之家小编一起看看吧
    2018-08-08
  • 基于javascript中的typeof和类型判断(详解)

    基于javascript中的typeof和类型判断(详解)

    下面小编就为大家带来一篇基于javascript中的typeof和类型判断(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 微信小程序开发数据缓存基础知识辨析及运用实例详解

    微信小程序开发数据缓存基础知识辨析及运用实例详解

    这篇文章主要介绍了微信小程序开发数据缓存基础知识辨析及运用实例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 前端解决跨域问题nmp安装http-server的问题

    前端解决跨域问题nmp安装http-server的问题

    这篇文章主要介绍了前端解决跨域问题-nmp安装http-server的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • SublimeText自带格式化代码功能之reindent

    SublimeText自带格式化代码功能之reindent

    这篇文章主要介绍了SublimeText自带格式化代码功能之reindent的相关资料,需要的朋友可以参考下
    2015-12-12
  • es6 javascript对象Object.values() , Object.entries()示例详解

    es6 javascript对象Object.values() , Object.entr

    这篇文章主要介绍了es6 javascript对象Object.values() , Object.entries()的示例代码,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • 小程序云开发实战小结

    小程序云开发实战小结

    这篇文章主要介绍了小程序云开发实战小结,本文详细的介绍了云开发以及环境的搭建和项目实践,非常具有实用价值,需要的朋友可以参考下
    2018-10-10
  • js实现扫雷源代码

    js实现扫雷源代码

    这篇文章主要为大家详细介绍了js实现扫雷源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 小程序实现列表倒计时功能

    小程序实现列表倒计时功能

    这篇文章主要为大家详细介绍了小程序实现列表倒计时功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01

最新评论