js变量指向的问题

var a = [1,2];
var b = [1,2,a];
a=[3];
打印b //[1,2,[1,2]]
第一个问题:b为什么没有变?

var a = [1,2];
var b = [1,2,a];
a[0]=3;
打印b //[1,2,[3,2]]
第二个问题:b为什么变了?

诚问;麻烦说的通俗易懂些

阅读 4.6k
4 个回答

首先,数组是引用类型的值,意思就是数组名是指向内存地址的一个指针。

所以a是数组的一个指针,a重新赋值是改变了a的指向,b也是一个指针对吧,它指向的就是[1, 2, // a指向的那个数组,即[1, 2]]

a只是更改了指向,没有更改原来那个指向的内容。

但是a[0]就不一样了,它是修改了内存地址的内容。

手机打的…可能体验比较差,但是有问题可以继续问我~

我的理解如下,求大神解释更底层的原理~

        {
            let a = [1,2]; //a的内存指向[1,2]
            let b = [1,2,a]; // b的内存指向[1,2,[1,2]]
            a = [3]; //改变内存指向 指向[3]
            console.log(b);//现在的b还在第二行代码这里啊
        }

        {
            let a = [1,2];
            let b = [1,2,a];
            a[0] = 3; //改变内存中的内容 简而言之 就是赋值操作 
            console.log(b);
        }

a*=[]
b*=[&a]
&a[0]=222
a*=[1]
a*赋值不会更改&a
给把数组的指针赋值给变量不会影响变量原有数据

你搞清楚传值和传引用的问题就可以了,数组是对象,传的是引用。

第一个问题:
首先var a = [1,2];中的数组[1,2]已经在内存中了,
a得到它的引用地址,此时b再引用a,
相当于得到[1,2]的地址放到b[3]的位置,
之后再把数组[3]的引用地址传给a,此时只是数组[3]的地址传给a,并不会改变原来数组[1,2]的值

第二个问题:
明白数字时常量,传的是值,数组是对象,传的是引用 第二问题就解决了
[1,2,a]中的a是数组,获得的是数组[1,2]的引用,
此时赋值 a[0]=3;相当于把数组[1,2]的第一个元素赋值为3,是传值,相当于更改对象的值
而[1,2,a]中的a仅仅是获得[1,2]的引用地址,引用地址里的值改变了,所以[1,2,a]也跟着改变了

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