JavaScript数组赋值引用及理解

今天看到一道前端js面试题,加深了我对数组的一些理解。


var arr1 = 'edison'.split('');

var arr2 = arr1.reverse();

var arr3 = 'chan'.split('');

arr2.push(arr3);

console.log('arr1:length='+arr1.length+'  last='+arr1.slice(-1));

console.log('arr2:length='+arr2.length+'  last='+arr2.slice(-1));

一开始我的答案是

arr1:length=6 last='e'(错的)

arr2:length=7 last='c','h','a','n'

但是我错了。。。,因为答案如下:

arr1:length=7  last=c,h,a,n

 arr2:length=7  last=c,h,a,n

我一开始很疑惑,因为我理解的是将数组的变量赋值跟js基础类型的赋值一样,将一个数组变量赋值给另一个变量!!!!。所以导致我arr1的结果出错。

因为实际正确的是将这两个变量指向内存堆中的同一个数组(浅拷贝),无论通过改变其中哪一个变量,实际都是改的内存中的那一个数组!!!


JavaScript数组赋值引用及理解_第1张图片

之所以我的结果错了,是因为我的理解是将arr1的值copy给了arr2,如图:


JavaScript数组赋值引用及理解_第2张图片
错的理解

于是,我看到了这样一段代码~~~,瞬间理解加深!!!

var a=['q','w','e','r'];

var b=a;

a=['a','s','d','f'];

console.log(b);

有的同学没太理解的或者看了我之前的理解的,可能会以为 b应该可能会是['a','s','d','f'],但是错了!!!


JavaScript数组赋值引用及理解_第3张图片
结果诧异!!!

但是如果对数组比较理解的同学就嗤之以鼻了,,,,这不如同制仗一般吗? 毋庸置疑的嘛。没错


JavaScript数组赋值引用及理解_第4张图片


JavaScript数组赋值引用及理解_第5张图片

这里的a 是在内存中重新开辟了一个内存空间来存放'a','s','d','f',并将a指向它,所以一旦数组出现 [  ]  ,我们就要注意了,相当于是 a是又创建一个数组并赋值了,它就会在内存队中开辟新的空间,哪怕它以前再辉煌,他也只看现在,活在当下,从此a,b不再是一路人!!!

你可能感兴趣的:(JavaScript数组赋值引用及理解)