类数组对象arguments和数组在应用时的区别

代码片段一:

function b(x, y, a) {
    arguments[2] = {"name" : "func"};
    alert(a.name);    //"func"
}
b(1, 2, {"name" : "win"});

代码片段二:

function b(x, y, a) {
    var arr = [x,y,a];
    arr[2] = {"name" : "func"};
    alert(a.name);    //"win"
}
b(1, 2, {"name" : "win"});

逛网站的时候偶然发现了代码片段一,旁边有个学java的表示对代码片段一的结果很不理解,举出了代码片段二。应该从什么角度解释这两段代码结果的区别呢?求解。

阅读 4k
3 个回答

在第二段中

arr[2] = {"name" : "func"};

只改变了arr数组、,并没有修改到实际的a,你可以试着在第二段代码中console.log(arguments)来查看结果

首先数组和类数组都是对象,变量名存储的是指向对象的指针。

这样就可以说明,args和arr是两个对象,所以修改arr对args没有任何影响。

其次,args与参数变量的之间的关系特别的微妙,在传值不传值,是不是严格模式下,对其中一个赋值,表现各不相同,最好不用对args这样玩

Javascript其实和Java一样,函数调用的时候都是采用值传递,不知道题主了解这么吗?下面先说明一下这个问题:

var obj = {a:1};
function process(obj){
    obj = {};
}

process(obj);
//调用process方法把obj传入实际上传入的是obj对象的引用的值的copy
//所以后面把参数重新引用了一个新的对象不会影响实际参数

obj.a    // 还是1

题主上述例子中,var arr = [x,y,a],实际上就是var arr = new Array(x,,a);,当然参数的传递也是值传递。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题