本文会同步到我的个人网站中。
在ECMAScript中,变量可以存放两种类型的值
原始值指的是代表原始数据类型的值,例如:undefined null number string boolean
引用类型指的是复合类型值,例如:object function array 自定义对象
堆和栈
var num = 10; //变量名num和初始化值10都存放在栈中
复制代码
var obj = new object(); //变量名obj存放在栈中,而它指向的object()对象是存放在堆中的
复制代码
为什么原始值要放在栈中,引用值要放在堆中?
function Person(id,name,age){
this.id = id;
this.name = name;
this.age = age;
}
var num = 10;
var bol = true;
var str = "abc";
var obj = new Object();
var arr = ['a','b','c'];
var person = new Person(100,"笨蛋的座右铭",25);
复制代码
由上图可以看出,我们不能直接操作堆中的数据,也就是说不能直接操作对象,但我们可以通过栈中存放的变量指针来进行操作
堆比栈大,栈比堆的运算速度快,对象是一个复杂的结构,并且可以自由扩展,如:数组可以无限扩充,对象可以自由添加属性。将他们放在堆中是为了不影响栈的效率。而是通过引用的方式查找到堆中的实际对象再进行操作。相对于简单数据类型而言,简单数据类型就比较稳定,并且它只占据很小的内存。不将简单数据类型放在堆是因为通过引用到堆中查找实际对象是要花费时间的,而这个综合成本远大于直接从栈中取得实际值的成本。所以简单数据类型的值直接存放在栈中
总结