`

【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; 
}
分享到:
评论

相关推荐

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

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

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

    Q:那如何深拷贝一个对象呢? R:机智的你 JSON.parse(JSON.stringify(obj)); Q:使用stringify这种方式有何弊端? 性能问题,stringify再解析其实需要耗费较多时间,特别是数据量大的时候。 一些类型无法拷贝,...

    前端Javascript相关面试基础问答整理md

    12. 深拷贝与浅拷贝 13. 防抖和节流 14. 作用域和作用域链、执行期上下文 15. DOM常见的操作方式 16. Array.sort()方法与实现机制 17. Ajax 17. 垃圾回收 18.JS中的String和Math方法 ······

    JavaScript 面试思维导图

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

    2023年前端面试必备最新八股文(基础+进阶内容+持续更新)

    包括了css,javascript,vue,webpack,vite,html5新特性等等,包括了面试中比较常见的BFC,v8垃圾回收机制,vite和webpack的区别,vue中遇到的问到,防抖节流,深拷贝,浅拷贝,盒子模型,作用域,闭包,浏览器...

    最新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 │ ...

    移动端web某马机构前端内部面试题,es,js

    什么是深拷贝什么是浅拷贝?对闭包的理解?并能举出闭包的例子。什么是原型和原型链。es6-es10新增常用方法?怎么理解函数的防抖和节流?异步函数有哪些?怎么理解面向对象?真数组和伪数组的区别?数组如何进行降维...

    前端面试必备最新八股文(基础+进阶内容)2024年最新.docx

    包括了css,javascript,vue,webpack,vite,html5新特性等等,包括了面试中比较常见的BFC,v8垃圾回收机制,vite和webpack的区别,vue中遇到的问到,防抖节流,深拷贝,浅拷贝,盒子模型,作用域,闭包,浏览器...

    05-大事件和node阶段某马机构前端内部面试题.md

    什么是深拷贝什么是浅拷贝?对闭包的理解?并能举出闭包的例子。什么是原型和原型链。es6-es10新增常用方法?怎么理解函数的防抖和节流?异步函数有哪些?怎么理解面向对象?真数组和伪数组的区别?数组如何进行降维...

    front-end-interview-prepare:记录一些前端面试知识点

    前端面试准备记录gp在2020年10月开始的前端面试准备已经记录的知识点:JavaScript防抖与节流手写apply, call, bind手写promise对promise的理解手写newthis的指向问题深拷贝和浅拷贝的理解和手写深拷贝其他为什么在...

    Interviewproject:面试项目

    浅拷贝和深拷贝 16.高阶函数和偏函数 17.防抖和节流 18.事件委托 19.缓存机制 20.JS 执行上下文 21.跨域和 HTTP协议 22.Promise 23.Async---Await原理 24.MVVM 25.DOM-DIFF算法.md 26.双向数据绑定原理[] 27.前端...

    详解js中的对象的深浅拷贝

    本文是整理的浅拷贝和深拷贝中涉及的知识点,在工作中是非常重要的,在面试中也是必考的,希望对小伙伴们有所帮助! 为什么会产生深浅拷贝? 首先我们要知道一个流程 1,对象属于引用类型的,以后浏览器会为其开辟...

    wheel-awesome:天天造轮子,手写面试通用

    关注公众号加入微信交流群造车轮计划计划天天变框架原生Ajax JS基础承诺无极/种族路由新的通话/申请/绑定对象创建深拷贝,浅拷贝算法,设计模式二分查找快排二分查找冒泡排序选择排序订阅发布斐波那契算法去重这是...

    程序员面试刷题的书哪个好-front-end-interview:前端面试

    1.浅拷贝和深拷贝的区别 2.defer 和 async 的区别(JS 延迟加载的方式) defer 和 async、动态创建 DOM 方式(创建 script,插入到 DOM 中,加载完毕后 callBack)、按需异步载入 js 3.null 和 undefined 的区别? ...

    Front-End-Journey:前端工程师的方式。 :thinking_face:

    深拷贝/浅拷贝 函数柯里化 ES6相关 箭头函数 async函数 class generator函数 iterator接口 proxy 数组扁平化(待优化) function相关 JsonP ES6module(node暂不支持) 面向对象,深入对象 ways(继承的方法) object ...

    Knowledge-Sharing::fire:LuckRain7 的前端知识分享:smiling_face_with_smiling_eyes:(欢迎star,持续更新)

    前端组件库工具集合【提高效率】必备工具集合推荐(持续更新...)NPM包分析工具推荐:blue_book: JavaScript防抖、节流深拷贝和浅拷贝一道“简单”的 This 题解析一道关于 JavaScript 代码执行顺序的面试题解析如何在...

    asp.net知识库

    帮助解决网页和JS文件中的中文编码问题的小工具 慎用const关键字 装箱,拆箱以及反射 动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个...

Global site tag (gtag.js) - Google Analytics