JavaScript中的基本类型和引用类型的复制使用

2 篇文章 0 订阅
1 篇文章 0 订阅

js中的数据类型分为两种:基本类型和引用类型。
基本类型:number,string,boolean,undefined,null
引用类型:object, function, array
基本类型是存放在栈中的,而引用类型时存放在堆中的(可以理解为使用引用类型时,对引用类型的复制只是在栈中开辟一块内存存放指向了堆内存中的引用类型的地址,并没有真正的复制引用对象)。

基本类型的复制:
基本类型的复制其实就是在栈中开辟了一块新的内存来存放新的变量,这个变量的值是自己的,不过是和前面的相同,它们是相互独立存在的,其中一个改变不会影响到其他的值。
ex:

var foo = 3;
var bar  = foo;
foo = null;
console.log(bar);     //3 

因为a,b均保存在栈中,a的改变并不会影响到b的值,所以它们之间的值互不影响。

引用类型复制
声明的对象其实是在栈内存中开辟了一块内存存储了一个指针,该指针指向堆内存中引用对象的存储地址。复制对象的过程就是把对象的地址复制给了另外一块栈内存 即另一个对象变量,两个指针均指向同一个堆中的对象,所以其中一个修改,另一个也会被修改。

var foo = {};
var bar = foo;
bar.sex = "male";
console.log(foo.sex);    // male

由于它们两个指向的是同一个对象,bar改变的是foo在堆中的引用,所以foo的sex属性也是male。
那麽问题来了, 当我们把其中的一个赋值为null时,另一个是不是也成了空对象呢?答案是No。
example:

var foo = {};
var bar = foo;
bar.sex = "male";
console.log(foo.sex);    // male

foo = null;
console.log(bar.sex);    //male

由上例子可以看出当我们把一个对象置空时并不会改变另一个对象,为什么呢?
答:那是因为foo不再指向堆中的对象,null值在此表示一个空对象指针。但是堆中的那个对象仍然存在,栈中的bar仍然指向它。

那么还有点小问题:不是说基本类型是放在栈中,没有属性和方法麽? 那怎么Number还有toString(),toPrecision(),String还是有那些length, substring(), split()等等一大堆属性,方法呢?

相关文章:JavaScript中基本类型是如何进行属性和方法操作的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kirinlau

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

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

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

打赏作者

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

抵扣说明:

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

余额充值