js深拷贝的理解与方法

来源于某次面试,很多时候我们都有这种感觉,原理我好像懂诶,但是要我写的话我能不能百度一下【狗头】。

js的深拷贝和浅拷贝的区别

一般来说,基本数据类型的复制,不存在深浅拷贝之分,复制的结果是创建一个完全独立于原值的新值,可以认为基本数据类型的拷贝都是深拷贝。需要仔细研究的是引用数据类型:

//a为引用类型,以下复制为浅拷贝
var a = {x:1,y:2};
var b = a;

a被赋值,从a向b赋值,此时复制的是保存在栈内存中的值。引用类型的值是保存在内存中的对象,但不是实际的对象,而是对象的引用,是对象存在堆内存的地址的指针。因此,b从a复制得到的也是这个指针,修改b相当于修改a,因为它们指向同一个对象,这就是浅拷贝。如果要进行引用类型的深拷贝操作,需要给b在堆内存中新建一个对象,然后从a处按属性复制给b。

//a为引用类型,以下复制为深拷贝
var a = {x:1,y:2};
var b = {};
for (key of a) {
	b[key] = a[key];
}
// 原理大致如此,实现方法还有很多

js的基本数据类型

基本类型值指简单的数据段,比如:Undefined、Null、Boolean、Number、String。

js的引用数据类型

引用类型值指那些可能由多个值构成的对象,比如:Object、Array、Date、RegExp、Function。

面试过程中受到的连环锤击

题目:输入一个值,输出它的深拷贝。
1. 万一输入是对象?数组?
2. 万一对象里面有对象?有数组?
3. 万一数组里面有对象?有数组?
4. 命名方式要注意一下(习惯不好小尴尬)

最后在面试官的灵魂叩问下,完成了这个方法,可能还有欠缺,望大家指正:

function trans(inputs) {
    var outputs;
    if (inputs instanceof Array) {
        outputs = [];
        for (x of inputs) {
            outputs.push(trans(x));
        }
    } else if (inputs instanceof Object) {
        for ([k, v] of inputs) {
            outputs[k] = trans(v);
        }
    } else {
        outputs = inputs;
    }
    return outputs;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值