js内存的机制

说的肯定有错的地方,让高手们贱笑了

首先来执行:
var str="abc";
上面这条语句,会让图中第一条红线建立起来,左侧的str是一个变量,它指向的是存储在栈中的一个字符串,这就是我们理解的“引用”,str只是一个指向真正内存的指针;
然后执行:
str+="de";
这时,堆栈中并不是和想象的一样将"abc"原地拼接一个"de",而是新建一个"de"字符串,操作str+"de"就等于是操作"abc"+"de",这时会在栈中生成一个全新的内存地址,它的值是"abcde",这并没有改变原来的"abc";
而这时,str的指向就会被改变,图中第一条红线会消失,第二条红线被建立,str变成引用了最新生成的字符串"abcde"。

再看下边,执行:
var obj1={x:1,y:1};
同上,会在内存中生成一个object;
执行:
var obj2=obj1;
这句的效果就是把obj2指向的地址变成和obj1的指向一样,两个变量都指向了那个object
这时如果执行:
delete obj1;
或者
obj1=undefined; 或者obj1=null;
则图中第三条红线就会消失,这么做的效果仅仅是不让obj1再引用任何东西了
那右边那个object何时会真正消失呢?
这时再次执行:
obj2=null;
这时,红线4也会消失
这样的话 过那么一小段时间后,js引擎发现没有任何变量在引用右侧的object,就会自己将它清除出去,这时它才真正不存在了

也许有些js引擎不是这个原理吧,比如IE6?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值