代码片段一:
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的表示对代码片段一的结果很不理解,举出了代码片段二。应该从什么角度解释这两段代码结果的区别呢?求解。
首先数组和类数组都是对象,变量名存储的是指向对象的指针。
这样就可以说明,args和arr是两个对象,所以修改arr对args没有任何影响。
其次,args与参数变量的之间的关系特别的微妙,在传值不传值,是不是严格模式下,对其中一个赋值,表现各不相同,最好不用对args这样玩
在第二段中
arr[2] = {"name" : "func"};
只改变了arr
数组、,并没有修改到实际的a
,你可以试着在第二段代码中console.log(arguments)
来查看结果
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);
,当然参数的传递也是值传递。