我想将名为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);
答案 0 :(得分:2)
在逐字查看正确的字符串输出时,问题就变得清晰了。它是{"0":"horse"}
表示JSON对象,而原始输出表示JSON数组。
然后原因可以解释为:
plain Object (不是数组)是.extend
和
JSON.stringify
将仅为 real Array 对象 1 发出JSON数组(即[..]
)
根据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]]内部属性,但规范并未提供任何正式机制来执行此操作。