使用JQuery.Extend克隆数组,但JSON.stringify看起来与原始不同

时间:2014-10-04 21:59:55

标签: jquery json clone

我想将名为myArr的数组克隆到_myArr中,并希望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/

1 个答案:

答案 0 :(得分:2)

在逐字查看正确的字符串输出时,问题就变得清晰了。它是{"0":"horse"}表示JSON对象,而原始输出表示JSON数组。

然后原因可以解释为:

  1. plain Object (不是数组)是.extend

  2. 的结果
  3. JSON.stringify real Array 对象 1 发出JSON数组(即[..]

  4. 根据documentation,返回的对象是提供给.extend的第一个合并对象。因此,原始代码大致相当于:

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

    在向[]提供.extend作为第一个对象的同时,#34;修复"这(因此导致所有内容都合并到所述数组对象中),通常不适合在数组上使用扩展。


    1 这包含在ECMAScript 5th ed的15.12.3 stringify中,如果[对象]的[[Class]]内部属性是&#39,则归结为" ; Array'"然后发出一个JSON对象。虽然实现可以定义机制以更改[[Class]]内部属性,但规范并未提供任何正式机制来执行此操作。