专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

Objectassign是浅拷贝还是深拷贝_java

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/3/9 4:38:06       共计:3564 浏览

Objectassign是浅拷贝还是深拷贝?

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。

Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象。该方法使用源对象的[[Get]]和目标对象的[[Set]],所以它会调用相关 getter 和 setter。因此,它分配属性,而不仅仅是复制或定义新的属性。如果合并源包含getter,这可能使其不适合将新属性合并到原型中。为了将属性定义(包括其可枚举性)复制到原型,应使用Object.getOwnPropertyDescriptor()和Object.defineProperty() 。

String类型和 Symbol 类型的属性都会被拷贝。

在出现错误的情况下,例如,如果属性不可写,会引发TypeError,如果在引发错误之前添加了任何属性,则可以更改target对象。

Object.assign 不会在那些source对象值为 或 的时候抛出错误。

针对深拷贝,需要使用其他办法,因为 Object.assign()拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向那个引用。也就是说,如果对象的属性值为简单类型(如string, number),通过Object.assign({},srcObj);得到的新对象为;如果属性值为对象或其它引用类型,那对于这个对象而言其实是的。

深拷贝的几种实现方法JSON.stringify 和 JSON.parse

用 JSON.stringify 把对象转换成字符串,再用 JSON.parse 把字符串转换成新的对象。

可以转成 JSON 格式的对象才能使用这种方法,如果对象中包含 function 或 RegExp 这些就不能用这种方法了。

Object.assign()拷贝

当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。

通过jQuery的extend方法实现深拷贝

let $ = require('jquery');let obj1 = {a: 1,b: {f: {g: 1}},c: [1, 2, 3]};let obj2 = $.extend(true, {}, obj1);lodash.cloneDeep()实现深拷贝let _ = require('lodash');let obj1 = {a: 1,b: { f: { g: 1 } },c: [1, 2, 3]};let obj2 = _.cloneDeep(obj1);使用递归的方式实现深拷贝function _deepClone(source) {let target;if (typeof source === 'object') {target = Array.isArray(source) ? [] : {}for (let key in source) {if (source.hasOwnProperty(key)) {if (typeof source[key] !== 'object') {target[key] = source[key]} else {target[key] = _deepClone(source[key])}}}} else {target = source}return target}

更多经典前端面试题,请到github查看或参与讨论

https://github.com/daily-interview/fe-interview

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:sso是什么代称_java | ·下一条:juicessh怎么连接腾讯云服务器_服务器

Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有