今天看到一道前端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的结果出错。
因为实际正确的是将这两个变量指向内存堆中的同一个数组(浅拷贝),无论通过改变其中哪一个变量,实际都是改的内存中的那一个数组!!!
之所以我的结果错了,是因为我的理解是将arr1的值copy给了arr2,如图:
于是,我看到了这样一段代码~~~,瞬间理解加深!!!
var a=['q','w','e','r'];
var b=a;
a=['a','s','d','f'];
console.log(b);