在JavaScript里函数参数能够任何类型,对于非引用类型的变量以值传递很好理解,在向参数传递基本类型的值时,被传递的值会被复制给命名参数,即arguments对象数组的中一个元素,以下:javascript
var a = 1;
function add(num){ num++; return num; } var b = add(a);
console.log(c); //2
console.log(a); //1 未改变
这能够看出在把a以参数传给add函数时,先把a复制一份传给argument命名参数,根据基本类型数据的特性,复制基本类型数据后是彻底两个独立的个体,只是值相同而已,互不影响。java
接下来看若是参数为复杂类型数据,如object时,以下:数组
var obj = { name: "小白" }
function change (obj) {
obj.name = "小黑";
return;
}
change(obj);
console.log(obj.name); //小黑
这样乍一看好像是引用传参,但写下来在看下列代码: 函数
var obj = { name: "小白" } function change (obj) {
obj.name = "小黑"
obj = new Object(); obj.name = "大黄"; return; }
change(obj); console.log(obj.name); //小黑
其实当参数为引用类型数据时,它也是按值传递的,只是根据对象的特性,但复制一份obj时,两个对象都指向同一个地址,所以在第二个代码示例里,change里改变了obj.name时,它指向的地址也被改变,全局变量obj的name属性天然也改变了。第三个代码示例里也证实了js函数参数是按值传递,若是是引用传参的话,第三个代码示例结果的console出来的应该是“大黄”了。 对象