javascript学习——数据表示和内存

引言:

大家都知道在js语言中,只有基本数据类型boolean,Number,String,Null和Undefined,其他的都是对象。v8 和JavascriptCore数据管理的思路相似,都是通过使用句柄Handle来操作数据。句柄是大小固定的指向空间。在32位平台中是4 Byte。其中基本类型,直接把数据存放在句柄中即可,而对于引用类型,句柄中存放的是指针,具体的内容存放在堆中。

句柄的定义:


后面32bit表示数据,前面的32bit区分不同的数据类型。

在内存中的表示:


stack中存放着句柄们,引用类型的数据放在Heap中。数据的赋值,即通过句柄内容的赋值来实现。

一个例子:

var str_a = "a";
var str_b = str_a; 

str_b = "b"; 

var obj_a = {v:"a"}; 
var obj_b = obj_a;

obj_b.v = "b";
经过变量提升之后:
var str_a;  // (1)
var str_b;  // (2)
var obj_a;  // (3)
var obj_b;  // (4)

str_a = "a"; // (5)
str_b = str_a; // (6)
str_b = "b";  // (7)

obj_a = {v:"a"}; // (8)
obj_b = obj_a; // (9)

obj_b.v = "b"; // (10)

在内存中的变化为:


具体过程为:
1-4: 变量声明阶段,分别在stack中创建这四个变量的句柄,其中内容为undefined
5: 赋值操作,在str_a的句柄中,保存str_a的值为“a”
6:赋值操作,在str_b的句柄中,保存str_a的句柄值,即为"a"
7:赋值操作,修改str_b句柄中保存的值,此时str_b = "b"
8:赋值操作,在obj_a中保存一个指针,指向heap中,为{v:a}分配的空间的首地址。
9:赋值操作,在obj_b中保存obj_a句柄中的值
10:赋值操作,首先在obj_b 的地址,指向 Heap中的那片空间,修改v的值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值