js堆伐理解及深浅拷贝

保持对代码的热爱并保持怀疑态度

什么是栈堆,及其区别

  • 栈:用来保存变量的名称或地址,稳定,不可更改,空间小; 先进后出
  • 堆:用来保存数据或值,空间大,可被修改 :先进先出
  • 关系:一对一,多对一,不能一对多

什么是值传递,什么是引用传递

  • (基本数据)值传递:内有地址和值之分,值就是地址,地址就是值
    – 字符,数据,布尔,undefind

  • (复杂数据)引用传递:有地址和值,地址是地址,存在栈中,值是值,存在堆中,被栈中的地址指向
    – 对象

深浅拷贝的区别,如何实现深拷贝

  • 浅拷贝:只拷贝地址
  • 深拷贝:拷贝值
  • 实现深拷贝:先创建一个新的地址,逐个拷贝原地址中的值

栈中直接是深拷贝

    var a=1;
    var b=a;
    b=20;
    console.log(a);
    console.log(b);

拷贝a的值,然后b重新赋值不会影响到a的值。

对象的浅拷贝

浅拷贝

var a={
    sex:123,
    yty:456
}
var b=a;
b.sex=12456
console.log(a);
console.log(b);

改变b的时候同时会改变a对象中的值

对象的深拷贝方式

用for in 遍历

var a={
    sex:123,
    yty:456
}
var b={};

for( let i in a){
    b.sex=a.sex;
    b.yty=a.yty
}
console.log(b);

利用JSON的转化实现

var a={
    sex:123,
    yty:456
}

var b=JSON.parse(JSON.stringify(a));
b.sex="sdd"
console.log(b);
console.log(a);

技术有限,目前只会这两种,但是这两种缺点很明显
JSON.stringify()由于返回了新对象,如果对象中存在函数,undefind会丢失

for-in用来循环对象中的属性,但是通过for-in循环输出的属性名的顺序是不可测的。具体来说,所有属性都会被返回一次,但返回的先后次序可能会因浏览器而异。

ES5之前:如果表示要迭代的对象的变量值为null或undefined,for-in语句会抛出错误;

ES5之后:这种情况不再抛出错误,而只是不执行循环体。

for-in会遍历原型链上的属性

所以最好的方法就是自己封装一个函数专用来实现拷贝。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

划水的乌贼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值