首页 > JS函数传递一个引用类型的参数

JS函数传递一个引用类型的参数

    function box(obj){  
        obj.name = "Lee";
    }
    var obj = new Object();
    obj.name = "Look";
    box(obj);
    console.log(obj.name);   //打印Lee
    function box(obj){ 
        obj.name = "Lee";
    }
    var obj = new Object();
    box(obj);
    obj.name = "Look";
    console.log(obj.name);   //打印Look

上面2段代码中,obj.name = "Look"这句代码放置的位置不同,为什么结果差别这么大?


在JS中函数的参数传递都是值传递,没有引用传递。var obj = new Object()这个obj的值是个指针,指向新创建的Object类型的对象,而这个对象是放在堆中的。全局中的obj引用了这个对象。当全局中的obj传到box(obj)中时,由于是值传递,在函数中的变量obj(这是个局部变量和全局中的obj毫无关系)就指向了堆中的object对象,也就是说此时有两个变量(分别是局部的obj和全局的obj)同时指向了堆中的同一个object对象,两个做的任何操作都会影响到堆中的同一个Object对象。所以obj.name的最终值取决于你对它的最后更改。


注意下,js中是没有按引用传递这一说法的,引用类型作为参数传入到函数中算是按共享传递,对象obj其实也是一个指针啊,所以传参过程就是obj将其地址复制给box函数中的局部变量obj中,其实全局的obj与函数中局部obj指向的是内存中的同一块地址,所以可以看出,函数也可以修改对象obj的属性值,你上面的代码相当于

var obj = new Object();
obj.name = "Look";
obj.name = "Lee";
console.log(obj.name);   // 这肯定是Lee把
var obj = new Object();
obj.name = "Lee";
obj.name = "Look";
console.log(obj.name);   // 这肯定是Look把
【热门文章】
【热门文章】