JavaScript中数组和对象复制的示例分析
这篇文章给大家分享的是有关JavaScript中数组和对象复制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
一、数据类型
从狭义上来说,JS把所有的数据分成两大类型:基本类型和引用类型,其中基本类型包括Undefined、Null、Boolean、Number和String,引用类型为Object,常用的Array、Date、RegExp、Function等都属于Object类型。
基本型数据和引用型数据的区别之一就是,在复制变量时,基本型数据复制独立的一份新的拷贝,而引用型数据复制的是原变量的引用。下面是一个例子:
// 基本类型数据的复制
var a = 10;
var b = a; // b = 10
a = 20; // a = 20, b = 10
// 引用类型数据的复制
var m = [1, 2];
var n = m;
m[0] = 10;
console.log(n[0]); // 10
如果我想复制引用类型本身的值而非引用,显然不能采用上面的方式。
二、数组的浅复制
浅复制是指对象(数组)被复制时,其引用字段的值不会被复制,而是复制了对应字段的引用。如:
var class="lazy" data-src = [
'alpha',
['bravo', 'chalie']
];
var dest = [];
for (var i = 0; i < class="lazy" data-src.length; i++) {
dest[i] = class="lazy" data-src[i];
}
//此时,如果改变class="lazy" data-src中的引用字段,dest中相应的字段也会被改变
class="lazy" data-src[1].push('delta');
console.log(dest[1]); // ['bravo', 'chalie', 'delta']
浅复制一般用于一维数组,即数组中不存在引用类型的情况。常用的浅复制方法有:
concat方法
var class="lazy" data-src = ['alpha', 'bravo'],
dest = [];
dest = dest.concat(class="lazy" data-src);
concat方法更多地被用在数组合并中,比如:
var a = ['alpha', 'bravo'],
b = ['chalie', 'delta'],
combine;
combine = a.concat(b);
特别要指出,concat用于数组合并时,是将两个(或多个)数组中的所有元素复制到新的对象,对于大型数组来说,开销比较大。更好的办法是把后一个数组的元素复制到前一个数组中:
var class="lazy" data-src = ['alpha', 'bravo'],
dest = ['chalie', 'delta'];
Array.prototype.push.apply(class="lazy" data-src, dest);
slice方法
slice方法可以从已有数组中返回选定的元素,返回的是一个新数组。
var class="lazy" data-src = ['alpha', 'bravo'],
var dest = class="lazy" data-src.slice(0);
三、对象的浅复制
对象的浅复制可以用for-in遍历来实现,在es6中提供了更为方便的Object.assign()方法。
var class="lazy" data-src = {name: 'fox', age: 20},
dest = null;
dest = Object.assign({}, class="lazy" data-src);
也可以使用jQuery中的$.extend,underscore中的_.extend等方法来实现对象的复制。
四、深度复制
浅复制的应用场景有限,更多情况下,我们希望能够将对象复制出一个完整的副本,这就需要用到typeof或instanof操作符来对各个字段的类型进行判断。如果某字段是基本类型的,可以直接复制。如果某字段是引用类型的,还需要对该字段的所有字段进行上述判断,这就很容易让我们考虑使用递归来实现这个功能。
function deep_copy(class="lazy" data-src, dest) {
for (var p in class="lazy" data-src) {
if (Array.isArray(class="lazy" data-src[p]) || class="lazy" data-src[p] instanceof Object) {
dest[p] = Array.isArray(class="lazy" data-src[p]) ? [] : {};
arguments.callee(dest[p], class="lazy" data-src[p]);
}else {
dest[p] = class="lazy" data-src[p];
}
}
}
在上述代码中,由于数组是特殊的对象,因此可以用for-in来遍历。
另外,还可以使用json大法:
function deep_copy_in_json(class="lazy" data-src) {
return JSON.parse(JSON.stringify(class="lazy" data-src));
}
这样做虽然比较简便,但原对象的很多属性在操作后会丢失,比如construtor属性以及对象原型中的一些方法。
感谢各位的阅读!关于“JavaScript中数组和对象复制的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341