原生JS实现浅拷贝与深拷贝
发布时间:2020-12-14 23:51:47 所属栏目:资源 来源:网络整理
导读:前面,使用jQ中的extend方法实现了js中对象的深浅拷贝,现在我们使用原生的JS来实现一下。 一、浅拷贝 function shallowCopy(obj) { var result = {}; for (var i in obj) { if (obj.hasOwnProperty(i)) { result[i] = obj[i] } } return result;} 我们用in
前面,使用jQ中的extend方法实现了js中对象的深浅拷贝,现在我们使用原生的JS来实现一下。 一、浅拷贝function shallowCopy(obj) { var result = {}; for (var i in obj) { if (obj.hasOwnProperty(i)) { result[i] = obj[i] } } return result; } 我们用in遍历obj下的属性,然后用hasOwnProperty方法(IE9+)过滤掉obj原型链上的属性,此方法可以浅拷贝对象中的属性,但是无法拷贝数组中的属性,修改原函数。 function shallowCopy(obj) { var result = obj.constructor === Array ? [] : {}; for (var i in obj) { if (obj.hasOwnProperty(i)) { result[i] = obj[i] } } return result; } 我们只需要判断传入的参数的类型,将拷贝至的对象进行改变就行了。如此便可以兼容对象和数组了。 二、深拷贝function deepCopy(obj){ var str,result = obj.constructor === Array ? [] : {}; if (window.JSON){ str = JSON.stringify(obj),result = JSON.parse(str); } else { for (var i in obj){ result [i] = typeof obj[i] === 'object' ? deepCopy(obj[i]) : obj[i]; } } return result ; }; 当内层是对象时,我们只需要再一次的循环赋值就行了,在这用的是递归。该函数和shallowCopy一样,可以兼容数组和对象。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |