`

【2016面试】js深拷贝和浅拷贝

 
阅读更多

一、数组的深浅拷贝

在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生。

var arr = ["One","Two","Three"];

var arrto = arr;
arrto[1] = "test";
document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,test,Three
document.writeln("数组的新值:" + arrto + "<br />");//Export:数组的新值:One,test,Three

像上面的这种直接赋值的方式就是浅拷贝,很多时候,这样并不是我们想要得到的结果,其实我们想要的是arr的值不变,不是吗? 


方法一:js的slice函数 

复制代码
对于array对象的slice函数,
返回一个数组的一段。(仍为数组)
arrayObj.slice(start, [end])
参数
arrayObj
必选项。一个 Array 对象。
start
必选项。arrayObj 中所指定的部分的开始元素是从零开始计算的下标。
end
可选项。arrayObj 中所指定的部分的结束元素是从零开始计算的下标。
说明
slice 方法返回一个 Array 对象,其中包含了 arrayObj 的指定部分。
slice 方法一直复制到 end 所指定的元素,但是不包括该元素。如果 start 为负,将它作为 length + start处理,此处 length 为数组的长度。如果 end 为负,就将它作为 length + end 处理,此处 length 为数组的长度。如果省略 end ,那么 slice 方法将一直复制到 arrayObj 的结尾。如果 end 出现在 start 之前,不复制任何元素到新数组中。
复制代码

 

var arr = ["One","Two","Three"];

var arrtoo = arr.slice(0);
arrtoo[1] = "set Map";
document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtoo + "<br />");//Export:数组的新值:One,set Map,Three

 

方法二:js的concat方法 

concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
语法
arrayObject.concat(arrayX,arrayX,......,arrayX)
说明
返回一个新的数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。

 

var arr = ["One","Two","Three"];

var arrtooo = arr.concat();
arrtooo[1] = "set Map To";
document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtooo + "<br />");//Export:数组的新值:One,set Map To,Three

 

二、对象的深浅拷贝

复制代码
var a={name:'yy',age:26};
var b=new Object();


b.name=a.name;
b.age=a.age;
a.name='xx';
console.log(b);//Object { name="yy", age=26}
console.log(a);//Object { name="xx", age=26}
复制代码

就是把对象的属性遍历一遍,赋给一个新的对象。

复制代码
var deepCopy= function(source) { 
var result={};
for (var key in source) {
      result[key] = typeof source[key]===’object’? deepCoyp(source[key]): source[key];
} 
   return result; 
}
分享到:
评论

相关推荐

    前端面试相关-深拷贝和浅拷贝的实现方法和区别

    前端面试相关-深拷贝和浅拷贝的实现方法和区别

    深入剖析javascript中的深拷贝和浅拷贝1

    JavaScript中的深拷贝和浅拷贝是编程面试中常见的概念,尤其在处理对象和数组时至关重要。它们主要涉及的是变量赋值时数据的复制方式。简单来说,浅拷贝是创建了一个新对象,但它的属性仍然是对原对象属性的引用,而...

    46_深拷贝与浅拷贝的区别1

    首先,我们来看JavaScript中的深拷贝和浅拷贝。在JavaScript中,对象的浅拷贝是通过简单的引用复制实现的。这意味着当一个对象被浅拷贝后,新旧对象共享同一块内存。如果原始对象的属性被修改,这种修改会影响到拷贝...

    JS面试题中深拷贝的实现讲解

    在JavaScript中,深拷贝是面试中经常出现的一个话题,因为它是理解和操作复杂数据结构的关键。深拷贝意味着创建一个全新的对象,这个新对象包含了原始对象的所有属性和值,包括嵌套的对象和数组,而且它们之间的关系...

    12-深拷贝.md

    在前端开发领域,深拷贝是一个面试中常见的算法题,它考验程序员对JavaScript语言特性的理解以及解决问题的能力。深拷贝是指将一个对象从内存中完整地拷贝出来,不共享任何引用。相比于浅拷贝,深拷贝需要递归地拷贝...

    前端JS基础知识点及常考面试题汇总

    7. 深拷贝和浅拷贝的区别是什么?如何实现深拷贝? 8. 箭头函数与普通函数的区别,特别是关于this的绑定。 9. 介绍Promise的基本使用及状态转换。 10. 解释JavaScript的垃圾回收机制。 通过学习以上知识点和理解...

    前端vue和js相关的面试题,初级,中级面试必问

    深拷贝和浅拷贝涉及对象复制的问题,浅拷贝只复制对象的引用,而深拷贝会创建新对象,复制所有层级的数据。实现深拷贝的方法包括 JSON 序列化再反序列化、递归遍历以及使用某些库提供的方法。 要判断一个对象是否...

    JavaScript常见面试题共41页.pdf.zip

    3. **对象与数组**:对象的创建、属性访问、原型链、深拷贝与浅拷贝、数组方法(push、pop、shift、unshift、splice、concat、slice等)。 4. **事件与DOM操作**:DOM元素的选择、操作、事件模型(捕获与冒泡)、...

    前端大厂最新面试题-deepCopy.docx

    在面试中,尤其是针对前端工程师的面试,深拷贝是考察候选人对JavaScript语言理解深度的一个重要题目。下面我们将详细探讨深拷贝的概念、实现方式以及提供的代码示例。 首先,我们来理解一下浅拷贝(Shallow Copy)...

    前端大厂最新面试题-copy.docx

    前端大厂最新面试题-copy.docx 本文将对前端大厂最新面试题-copy.docx进行详细分析,总结相关知识点。...深拷贝和浅拷贝是 JavaScript 中两个重要的概念,掌握它们可以帮助我们更好地理解和使用 JavaScript。

    JavaScript 面试思维导图

    JavaScript 面试思维导图,案例集合,基本内容,原型与原型链详解,闭包,继承,深拷贝和浅拷贝,数据类型和对数据的操作,递归与尾递归,内存问题,正则与web攻击,同步任务与异步任务,宏任务与微任务,单点登录

    JavaScript 24道面试题和答案.docx

    实现浅拷贝可以使用`Object.assign()`或扩展运算符`...`,深拷贝通常需要手动递归或者借助`JSON.parse()`和`JSON.stringify()`。 6. **执行上下文与执行栈**:执行上下文是变量和函数执行的环境,决定可访问的数据...

    js 面试24道经典面试题总结

    - 什么是对象的浅拷贝和深拷贝,如何实现? - `Object.keys()`, `Object.values()`, `Object.entries()`分别用于什么目的? 5. **数组方法** - `push()`, `pop()`, `shift()`, `unshift()`等方法如何改变数组? ...

    JavaScript 24道面试题及答案.docx

    浅拷贝的实现方式有 Object.assign() 和扩展运算符,深拷贝的实现方式有手写遍历递归赋值和结合使用 JSON.parse() 和 JSON.stringify() 方法。 5. 执行上下文和执行栈:变量或函数的执行上下文,决定了它们的行为...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题41.jQuery中Ajax和原生js实现Ajax的关系.mp4 │ Java面试题42.简单说一下html5.mp4 │ Java面试题43.简单说一下css3.mp4 │ Java面试题44.bootstrap的是什么.mp4 │ Java面试题45.什么是框架.mp4 │ ...

Global site tag (gtag.js) - Google Analytics