JS 面试级问题之--浅拷贝和深拷贝的区别和实现方法?
2018-02-23 14:08
274 查看
如果你想应聘前端工程师,这个问题你是绕不过去的?
浅拷贝和深拷贝的区别和实现方法?
首先,浅拷贝和深拷贝都只针对于像Object, Array这样的复杂对象,
区别:浅拷贝只复制对象的第一层属性、深拷贝可以对对象的属性进行递归复制
举个例子:
通过浅拷贝得到的object2的family属性和object1的family属性在内存中指向同一个地址,这显然并不是我们期望得到的效果
那么,用深拷贝是怎么做到的呢?
效果如下:
案例:
项目中也确实遇到了这个问题,分享给大家
从服务器fetch到数据之后我将其存放在store中,通过props传递给界面,然后我需要对这堆数据进行修改,那涉及到修改就一定有保存和取消,所以我们需要将这堆数据拷贝到其他地方,之前,我是这么做的
在对数据进行维护的时候我发现我并没有直接操作store里面的数据,但是store却有diff数据,这是这么回事呢?在检查了所有的操作,确定没有触发其他操作之后,我开始意识到这个问题,我用的是浅拷贝,所以当state中的数据进行更新之后,指向同一地址的store也会进行被动更新
浅拷贝和深拷贝的区别和实现方法?
首先,浅拷贝和深拷贝都只针对于像Object, Array这样的复杂对象,
区别:浅拷贝只复制对象的第一层属性、深拷贝可以对对象的属性进行递归复制
举个例子:
const obj1 = { name: 'mengft', family: ['父亲', '母亲', '妹妹'] } shallowCopy () { let object2 = {} for(let i in o) { if (o.hasOwnProperty(i)) { object2[i] = o[i] } } return object2 } console.dir(shallowCopy(obj1))
通过浅拷贝得到的object2的family属性和object1的family属性在内存中指向同一个地址,这显然并不是我们期望得到的效果
那么,用深拷贝是怎么做到的呢?
deepCopy (o, c) { c = c || {} for (let i in o) { if (typeof o[i] === 'object') { // 需要深拷贝 if (o[i].constructor === Array) { // 数组 console.log('是数组') c[i] = [] } else { // 对象 console.log('是对象') c[i] = {} } this.deepCopy(o[i], c[i]) } else { c[i] = o[i] } } return c } console.dir(this.deepCopy(obj1, { school: '天津科技大学' }))
效果如下:
案例:
项目中也确实遇到了这个问题,分享给大家
从服务器fetch到数据之后我将其存放在store中,通过props传递给界面,然后我需要对这堆数据进行修改,那涉及到修改就一定有保存和取消,所以我们需要将这堆数据拷贝到其他地方,之前,我是这么做的
componentWillRecieveProps(nextProps) { if (next props.nurseList !== this.props.nurseList) { this.setState({ nurseListSource: nextPorps.nurseList }) } }
在对数据进行维护的时候我发现我并没有直接操作store里面的数据,但是store却有diff数据,这是这么回事呢?在检查了所有的操作,确定没有触发其他操作之后,我开始意识到这个问题,我用的是浅拷贝,所以当state中的数据进行更新之后,指向同一地址的store也会进行被动更新
相关文章推荐
- js面试常问问题之实现log方法
- [置顶] 在js中如何实现方法重载?以及函数的参数问题
- 面试常见问题heibernate中sessin的get和load方法区别的实验解说
- 使用slice方法进行js对象拷贝 得到新的对象 不再互相干扰 解决引用变量的指向问题
- JS实现页面跳转的多种方法及区别
- JS中的两种数据类型及实现引用类型的深拷贝的方法
- JS类中定义原型方法的两种实现的区别
- 【最近面试遇到的一些问题】多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么
- 谈谈浅拷贝和深拷贝的区别,以及实现的方法
- JS类中定义原型方法的两种实现的区别
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
- js实现动态创建txt框。今天学生问此问题,做个小例子,大家也说说还有什么实现的方法。
- js 中实现页面跳转的方法(window.location和window.open的区别)
- 在js中如何实现方法重载?以及函数的参数问题
- 深拷贝与浅拷贝的区别,实现深拷贝的几种方法
- 关于js 方法,实现ajax请求时,return false/true无效的问题
- 两种方法实现js页面隔几秒后跳转,及区别
- 面试常见问题:java中wait()和sleep()方法的区别
- 零拷贝报文捕获要解决的几个问题,和现有的实现方法
- 多线程(线程间通信-多生产者多消费者问题-JDK1.5解决办法-范例),停止线程,线程中方法的区别,匿名内部类实现多线程,线程总结