Skip to content

javascript函数参数按值传递 #8

@aicekiller

Description

@aicekiller

看冴羽的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}对象。

链接

mqyqingfeng/Blog#10

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions