小白前端开发笔记-一文看JS懂参数传递(为什么说JS中所有参数传递都是值传递,不能通过引用传递参数)

参数传递

首先明确一点: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引用造成影响,改变数组对象可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值