加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 资源 > 正文

原生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一样,可以兼容数组和对象。

 

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读