ie9 ff11, javascript 數組處理的一個bug

來源:互聯網
上載者:User

我也知道是bug,還是本來就是這樣的

看js代碼:

 

var ep={ title:"預設相簿", desc:"快來上傳照片吧", img:"http://pic.**m...403d0c295512c740_mb.jpg", link:"u1191122496/photo/show/82354307",title:"預設相簿"}var list_photo=[]list_photo.push(ep)list_photo.push(ep)list_photo.push(ep)list_photo.push(ep)list_photo[1].img=url+'?'+idalert(list_photo[2].img)alert(list_photo[1].img)

結果彈出的兩個值是一樣的,其實所有的值都被修改了

 

 

 我找到了答案,在一個很古老的chm(script56.chm)文檔中:

在 JScript 中,對資料的處理取決於該資料的類型。

按值和按引用的比較

Numbers 和 Boolean 類型的值 (truefalse) 是按值來複製、傳遞和比較的。當按值複製或傳遞時,將在電腦記憶體中分配一塊空間並將原值複製到其中。然後,即使更改原來的值,也不會影響所複製的值(反過來也一樣),因為這兩個值是獨立的實體。

對象、數組以及函數是按引用來複製、傳遞和比較的。當按地址複製或傳遞時,實際是建立一個指向原始項的指標,然後就像拷貝一樣來使用該指標。如果隨後更改原始項,則將同時更改原始項和複製項(反過來也一樣)。實際上只有一個實體;“複本”並不是一個真正的複本,而只是該資料的又一個引用。

當按引用比較時,要想比較成功,兩個變數必須參照完全相同的實體。例如,兩個不同的 Array 對象即使包含相同的元素也將比較為不相等。要想比較成功,其中一個變數必須為另一個的參考。要想檢查兩個數組是否包含了相同的元素,比較toString() 方法的結果。

最後,字串是按引用複製和傳遞的,但是是按值來比較的。請注意,假如有兩個
String
對象(用 new String("something") 建立的),按引用比較它們,但是,如果其中一個或者兩者都是字串值的話,按值比較它們。

(測試發現,字串不是按引用複製複製和傳遞的)

注意   鑒於 ASCII 和 ANSI 字元集的構造方法,按序列順序大寫字母位於小寫字母的前面。例如 "Zoo" 小於 "aardvark"。如果想執行不區分大小寫匹配,可以對兩個字串調用toUpperCase()
toLowerCase()

傳遞參數給函數

按值傳遞一個參數給函數就是製作該參數的一個獨立複本,即一個只存在於該函數內的複本。即使按引用傳遞對象和數組時,如果直接在函數中用新值覆蓋原先的值,在函數外並不反映新值。只有在對象的屬性或者數組的元素改變時,在函數外才可以看出。

例如(使用 IE 對象模式):

// 本程式碼片段破壞(覆蓋)其參數,所以// 調用代碼中反映不出變化。function Clobber(param) {    // 破壞參數;在調用代碼中    // 看不到。    param = new Object();    param.message = "This will not work";}// 本段代碼改變參數的屬性,// 在調用代碼中可看到屬性改變。function Update(param){    // 改變對象的屬性;    // 可從調用代碼中看到改變。    param.message = "I was changed";}// 建立一個對象,並賦給一個屬性。var obj = new Object();obj.message = "This is the original";// 調用 Clobber,並輸出 obj.message。注意,它沒有發生變化。Clobber(obj);window.alert(obj.message); // 仍然顯示 "This is the original"。// 調用 Update,並輸出 obj.message。注意,它已經被改變了。Update(obj);window.alert(obj.message); // 顯示 "I was changed"。
檢驗資料

當按值進行檢驗時,是比較兩個截然不同的項以查看它們是否相等。通常,該比較是逐位元組進行的。當按引用進行檢驗時,是看這兩項是否是指向同一個原始項的指標。如果是,則比較結果是相等;如果不是,即使它們每個位元組都包含完全一樣的值,比較結果也為不相等。

按引用複製和傳遞字串能節約記憶體;但是由於在字串被建立後不能變更,因此可以按值進行比較。這樣可以檢查兩個字串是否包含相同的內容,即使它們是完全獨立產生的。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.