在JavaScript中,您可以拥有对象,如下所示:
var a = { foo: 12, bar: 34 };
带有键(命名)索引的数组,如下所示:
var b = [];
b['foo'] = 56;
b['bar'] = 78;
它们有点相似,但显然不一样。
现在奇怪的是,JSON.stringify似乎没有接受数组。没有错误或任何东西,JSON.stringify(b)只会产生[]。
见this jsfiddle example。我做错了什么,或者我只是误解了数组是如何工作的?
答案 0 :(得分:5)
Javascript不支持关联数组(如PHP)。
var b = [];
当您尝试创建对象时,明确声明一个数组。
Javascript中的数组只能包含数组的索引方法,而对象则更多 关联数组。
如果您将var b = [];
更改为var b = {};
,则会解决问题。
var b = {}
明确声明对象。
答案 1 :(得分:4)
Javascript数组是对象。有关详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Predefined_Core_Objects#Array_Object。
注意:如果为数组运算符提供非整数值 上面的代码,将在表示对象的对象中创建一个属性 数组,而不是数组元素。
JSON仅支持Javascript的一个子集。有关详细信息,请参阅http://www.json.org/。
JSON基于两种结构:
- 名称/值对的集合。在各种语言中,这被实现为对象,记录,结构,字典,哈希表,键控 列表或关联数组。
- 有序的值列表。在大多数语言中,这被实现为数组,向量,列表或序列。
具有在底层对象中创建的属性的Javascript数组不适合这些结构中的任何一个,因为它具有名称/值对的集合和有序的值列表,因此没有简单的方法来表示这样的直接在JSON中对象。
JSON.stringify方法在ECMAScript规范中定义。例如,请参阅http://www.ecma-international.org/ecma-262/5.1/#sec-15.12.3。
虽然有很多细节,但这里的相关位是对象值的字符串化方式:
如果Type(value)是Object,并且IsCallable(value)是false
- 如果值的[[Class]]内部属性为“Array”,则返回使用参数值调用抽象操作JA的结果。
- 否则,返回使用参数值调用抽象操作JO的结果。
给定您的数组,尽管向底层对象添加了参数,但结果是对有序的数组元素进行字符串化,而不是基础对象。
向数组对象添加参数没有任何问题,但它们不是数组的一部分,处理数组的函数或方法可能会忽略它们或任意处理它们。您已经看到JSON.stringify忽略了其他参数。其他功能也可能不这样做 - 你必须在每种情况下都找到它。
虽然没有错,但如果不向数组对象添加属性,可能会更容易理解。如果要添加属性,请从非数组对象开始。
而不是:
var b = [];
b['foo'] = 56;
b['bar'] = 78;
您可以使用:
var b = {};
b['foo'] = 56;
b['bar'] = 78;
答案 2 :(得分:1)
此快照来自IE浏览器。看到数组仍然是空白的。
实际上,将元素插入数组的方法是:
<强> 1。使用push() 的 2。在声明期间插入数组中的元素
如果要对数组进行字符串化,则必须在数组中包含数据。
所以,现在你想要对键值对进行字符串化,所以你必须将对象作为JSON.stringify()的参数传递,如下所示:
var test = {}; // Object
test['a'] = 'test';
test['b'] = []; // Array
test['b'].push('item');
test['b'].push('item2');
test['b'].push('item3');
var json = JSON.stringify(test);
alert(json);
现在解决您的问题:
注意:Google Chrome控制台提供的结果不同,这是Google Chrome中的一个错误。