一、数组的深浅拷贝
在使用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中的深拷贝和浅拷贝是编程面试中常见的概念,尤其在处理对象和数组时至关重要。它们主要涉及的是变量赋值时数据的复制方式。简单来说,浅拷贝是创建了一个新对象,但它的属性仍然是对原对象属性的引用,而...
首先,我们来看JavaScript中的深拷贝和浅拷贝。在JavaScript中,对象的浅拷贝是通过简单的引用复制实现的。这意味着当一个对象被浅拷贝后,新旧对象共享同一块内存。如果原始对象的属性被修改,这种修改会影响到拷贝...
在JavaScript中,深拷贝是面试中经常出现的一个话题,因为它是理解和操作复杂数据结构的关键。深拷贝意味着创建一个全新的对象,这个新对象包含了原始对象的所有属性和值,包括嵌套的对象和数组,而且它们之间的关系...
在前端开发领域,深拷贝是一个面试中常见的算法题,它考验程序员对JavaScript语言特性的理解以及解决问题的能力。深拷贝是指将一个对象从内存中完整地拷贝出来,不共享任何引用。相比于浅拷贝,深拷贝需要递归地拷贝...
7. 深拷贝和浅拷贝的区别是什么?如何实现深拷贝? 8. 箭头函数与普通函数的区别,特别是关于this的绑定。 9. 介绍Promise的基本使用及状态转换。 10. 解释JavaScript的垃圾回收机制。 通过学习以上知识点和理解...
深拷贝和浅拷贝涉及对象复制的问题,浅拷贝只复制对象的引用,而深拷贝会创建新对象,复制所有层级的数据。实现深拷贝的方法包括 JSON 序列化再反序列化、递归遍历以及使用某些库提供的方法。 要判断一个对象是否...
3. **对象与数组**:对象的创建、属性访问、原型链、深拷贝与浅拷贝、数组方法(push、pop、shift、unshift、splice、concat、slice等)。 4. **事件与DOM操作**:DOM元素的选择、操作、事件模型(捕获与冒泡)、...
在面试中,尤其是针对前端工程师的面试,深拷贝是考察候选人对JavaScript语言理解深度的一个重要题目。下面我们将详细探讨深拷贝的概念、实现方式以及提供的代码示例。 首先,我们来理解一下浅拷贝(Shallow Copy)...
前端大厂最新面试题-copy.docx 本文将对前端大厂最新面试题-copy.docx进行详细分析,总结相关知识点。...深拷贝和浅拷贝是 JavaScript 中两个重要的概念,掌握它们可以帮助我们更好地理解和使用 JavaScript。
JavaScript 面试思维导图,案例集合,基本内容,原型与原型链详解,闭包,继承,深拷贝和浅拷贝,数据类型和对数据的操作,递归与尾递归,内存问题,正则与web攻击,同步任务与异步任务,宏任务与微任务,单点登录
实现浅拷贝可以使用`Object.assign()`或扩展运算符`...`,深拷贝通常需要手动递归或者借助`JSON.parse()`和`JSON.stringify()`。 6. **执行上下文与执行栈**:执行上下文是变量和函数执行的环境,决定可访问的数据...
- 什么是对象的浅拷贝和深拷贝,如何实现? - `Object.keys()`, `Object.values()`, `Object.entries()`分别用于什么目的? 5. **数组方法** - `push()`, `pop()`, `shift()`, `unshift()`等方法如何改变数组? ...
浅拷贝的实现方式有 Object.assign() 和扩展运算符,深拷贝的实现方式有手写遍历递归赋值和结合使用 JSON.parse() 和 JSON.stringify() 方法。 5. 执行上下文和执行栈:变量或函数的执行上下文,决定了它们的行为...
│ Java面试题41.jQuery中Ajax和原生js实现Ajax的关系.mp4 │ Java面试题42.简单说一下html5.mp4 │ Java面试题43.简单说一下css3.mp4 │ Java面试题44.bootstrap的是什么.mp4 │ Java面试题45.什么是框架.mp4 │ ...