JavaScript數(shù)組賦值引用及理解

今天看到一道前端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é)果詫異!!!

但是如果對數(shù)組比較理解的同學(xué)就嗤之以鼻了,,,,這不如同制仗一般嗎? 毋庸置疑的嘛。沒錯



這里的a 是在內(nèi)存中重新開辟了一個內(nèi)存空間來存放'a','s','d','f',并將a指向它,所以一旦數(shù)組出現(xiàn) [ ?] ?,我們就要注意了,相當于是 a是又創(chuàng)建一個數(shù)組并賦值了,它就會在內(nèi)存隊中開辟新的空間,哪怕它以前再輝煌,他也只看現(xiàn)在,活在當下,從此a,b不再是一路人!!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 《ijs》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 5,342評論 0 7
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile麗語閱讀 3,865評論 0 6
  • 本文為轉(zhuǎn)載: 作者:zyydeveloper 鏈接:http://www.lxweimin.com/p/5f776a...
    Buddha_like閱讀 914評論 0 2
  • 故鄉(xiāng)小村的時光時不時在記憶中閃爍著,回想起來仍然記憶猶新。 在故鄉(xiāng)街口,路邊種著綠樹,路邊停放著...
    木子_1a77閱讀 222評論 0 0
  • 夏夜里說一句晚安 小人家式開頭,但今天更新的人是湯!! 小人家這幾天在遙遠的北方,如果想她請在后臺回復(fù)「想她」。然...
    每顆橙子閱讀 184評論 0 0