参数传递
首先明确一点:ECMAScript中所有参数传递都是值,不可能通过引用传递参数(js红宝书p66)
基本函数的参数传递为值传递不用解释:
例:
var i = 20;
function fn(a) {
console.log(a);//20
a++;
console.log(a);//21
}
fn(i);
console.log(i);
在JS中所有涉及函数的参数传递均是值传递,虽然会随着改变而改变但是仍为值传递****(复制地址的过程是值传递)**
如果是址传递 那么应该是复制参数地址的地址
类似引用的现象是因为对象是通过引用访问的
以上不易理解多啰嗦几句
例:**
function fn(obj) {
obj.name = 'sam';
};
var obj2 = new Object();
fn(obj2);
alert(obj2.name); // sam
以上为值传递和引用传递。
思考(有关变量的访问方式)
提示:
基本数据类型通过值访问
引用数据类型通过引用来访问
var a = [1,2,3];
var b = a;
a = [4,5,6];
alert(b); //[1,2,3]
好像数组是基本类型一样。。,但是:
var a = [1,2,3];
var b = a;
a.pop();
alert(b); //[1,2]
这是怎么回事?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
因为:(知乎解释)
a = [4,5,6];//改变的是a引用本身,没有改变数组对象,a和b没有了关系。简单点:在堆中开辟了内存0xx2 存放[4,5,6],而后a的值变成了0xx2,而之前堆中0xx1依旧存储着[1,2,3],b的值是0xx1,所以b不收a的影响。
a.pop();//改变的是数组对象,a引用没有改变。
b = a;//该操作后,b直接指向数组对象,不是b指向a,a再指向数组。
//所以改变a引用并不会对b引用造成影响,改变数组对象可以。