-
Notifications
You must be signed in to change notification settings - Fork 0
Description
看冴羽的JavaScript深入系列中参数按值传递文章,issue中的讨论很好,记录一下。
栈(stack)自动分配的内存空间,由系统自动释放
堆(heap) 动态分配的内存,大小不定也不会自动释放
基本数据类型是按值存放在内存栈中,所以可以直接按值访问;引用数据类型的变量是存在内存栈中的一个地址指针,指向内存堆中的对象。
运算符
=就是创建或修改变量在内存中的指向
初始化变量时为创建,重新赋值即为修改
var value = 1;
function foo(v) {
v = 2;
console.log(v); //2
}
foo(value);
console.log(value) // 1变量value的值是基本数据类型,所以value存放在内存栈中,它的值是1;
foo(value)方法调用,value是实参, 而foo函数声明中的v是形参,js引擎在内存栈中保存了形参v,它的值也是1;然后对内存栈中形参v的值就行了修改,而没有修改value的值,所以value还是1。
var obj = {
value: 1
};
function foo(o) {
o.value = 2;
console.log(o.value); //2
}
foo(obj);
console.log(obj.value) // 2变量obj的值是引用数据类型,所以{value:1}对象存放在内存堆中,变量obj存放在内存栈中,它的值其实是一个地址指针,指向存放在内存堆中的{value:1}对象;
foo(obj)方法调用,obj是实参, 而foo函数声明中的o是形参,js引擎在内存栈中保存了形参o,它的值也是一个地址指针,同样指向存放在内存堆中的{value:1}对象;所以通过形参o的地址指针修改了内存堆中的{value:1}属性值时,obj的属性值也被改变。
var obj = {
value: 1
};
function foo(o) {
o = 2;
console.log(o); //2
}
foo(obj);
console.log(obj.value) // 1变量obj的值是引用数据类型,所以{value:1}对象存放在内存堆中,obj变量存放在内存栈中,它的值其实是一个地址指针,指向存放在内存堆中的{value:1}对象;
foo(obj)方法调用,obj是实参, 而foo函数声明中的o是形参,js引擎在内存栈中保存了形参o,它的值也是一个地址指针,同样指向存放在内存堆中的{value:1}对象;然后o = 2修改了形参o在内存栈中的值,并没有修改{value:1}对象。