今天看到一道前端js面試題,加深了我對數(shù)組的一些理解。
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
我一開始很疑惑,因為我理解的是將數(shù)組的變量賦值跟js基礎(chǔ)類型的賦值一樣,將一個數(shù)組變量賦值給另一個變量!!!!。所以導(dǎo)致我arr1的結(jié)果出錯。
因為實際正確的是將這兩個變量指向內(nèi)存堆中的同一個數(shù)組(淺拷貝),無論通過改變其中哪一個變量,實際都是改的內(nèi)存中的那一個數(shù)組!!!
之所以我的結(jié)果錯了,是因為我的理解是將arr1的值copy給了arr2,如圖:
錯的理解
于是,我看到了這樣一段代碼~~~,瞬間理解加深!!!
var a=['q','w','e','r'];
var b=a;
a=['a','s','d','f'];
console.log(b);
有的同學(xué)沒太理解的或者看了我之前的理解的,可能會以為 b應(yīng)該可能會是['a','s','d','f'],但是錯了!!!
結(jié)果詫異!!!