標籤:style blog http color io ar 資料 sp div
最近做項目時,要對返回的資料[儲存在json數組中]做一次修改,但原資料要保留一次做備用。首先想到,原資料不動,用一個臨時的變數來修改,大致模型就是這樣:
// 原始:a=[1,2,3,4,5,.........];// 臨時:var b = a ;// 操作:b[b.length] = 1 ;
本來覺得是一個很簡單的問題。但測試時候發現,並沒得到想要的結果。測了很久才找到問題:a資料居然也跟著b的操作一起發生了改變,怎麼都想不通。問了同事,貌似他沒遇到過,也搞不清楚怎麼回事。只好求助網路查詢。查到了一個跟我相似的問題。
其中有這樣一個例子:
<script> var a=[1,2,3,4]; //例子1 var b=a; alert(a); //1234 alert(b); //1234 //例子2 var c=a; c[3]=5; alert(c); //1235 alert(a); //1235 //例子3 var d=a[1]; d=10; alert(a); //1234</script> //結論:數組對數組是參考型別,數組對變數是實值型別
其中一個仁兄給出瞭解釋:
JS中沒有指標,只有傳值(value)與傳址(reference引用)的區別
var a = [1,2,3,4] //a不僅是數組,還是個對象,實際上a就是對[1,2,3,4]的引用
var b=a
var c=a
//以上兩條指派陳述式建立了b與c 對a即[1,2,3,4]的引用,無論改變a 還是b抑或c 都是對[1,2,3,4]的操作,這就是傳址(堆中操作)
var d=a[1] //則是把a[1]的值"1"傳遞給d,對d的改變則不會影響a[1],即所謂的傳值(棧中操作)
這才有點明白。還是用原文的結論:
js數組是參考型別,它只允許通過索引來擷取或改變數組的值 參考型別的東西都是不能通過(它賦值過的外部變數)所改變的 也就是(它賦值過的外部變數)這個值改變了原數組不會有任何變化
原文點這裡
js 數組引用 發現的問題