2014-10-04 20 views
0

我想將名爲myArr的數組克隆到_myArr中,並希望JSON.stringify在兩個數組上看起來都是相同的。但他們沒有。使用JQuery.Extend克隆數組,但JSON.stringify看起來不同於原始

JSON.stringify(myArr,該)=> [ 「馬」]

JSON.stringify(myArr,該)=> 「{\」 0 \ 「:\」 馬\ 「}」

因此它似乎在字符串化時添加克隆數組的元素索引。我怎樣才能避免這種情況?

var myArr = []; 
myArr.push('horse'); 

var myArrStr = JSON.stringify(myArr); 
alert(myArrStr); 

var _myArr = JSON.stringify(jQuery.extend(true, {}, myArr)); 
var _myArrStr = JSON.stringify(_myArr); 
alert(_myArrStr); 

演示:看正確串輸出時,逐字http://jsfiddle.net/dvnb2Lw4/2/

回答

2

問題變得清晰。代表JSON對象的是{"0":"horse"},而原始輸出表示JSON數組。

然後,原因可以解釋爲:

  1. 平原對象(不是數組)是.extend和結果;

  2. JSON.stringify發射用於真實陣列對象 JSON數組(即[..])。

返回的對象是提供給.extend,具體根據documentation第一到合併的對象。這樣,原來的代碼是大致等效於:

var obj = {}; 
jQuery.extend(true, obj, myArr); 
JSON.stringify(obj); 

雖然供給[]作爲第一對象到.extend將「修復」該(如在一切這樣的結果合併到所述陣列對象),它通常不適合在數組上使用擴展。


這是覆蓋在其歸結爲「如果[[類]的[對象]是‘陣列’內部屬性」,則發出一JSON對象的ECMAScript第5版的15.12.3 stringify。雖然實現可以定義一個機制來改變[[Class]]內部屬性,但規範並沒有提供任何形式的機制來做到這一點。

相關問題