var a = { foo: 12, bar: 34 };
或者是带有键名的数组,像这样:
var b = [];
b['foo'] = 56;
b['bar'] = 78;
它们有些相似,但显然不同。
现在奇怪的是,JSON.stringify似乎不能处理数组。没有错误或任何提示,JSON.stringify(b)的结果只是[]。
请参见此jsfiddle示例。我做错了什么吗?还是我对数组的工作方式有误解?
var a = { foo: 12, bar: 34 };
或者是带有键名的数组,像这样:
var b = [];
b['foo'] = 56;
b['bar'] = 78;
它们有些相似,但显然不同。
现在奇怪的是,JSON.stringify似乎不能处理数组。没有错误或任何提示,JSON.stringify(b)的结果只是[]。
请参见此jsfiddle示例。我做错了什么吗?还是我对数组的工作方式有误解?
Javascript不支持关联数组(像PHP一样)。
var b = [];
明确声明一个数组,当您试图创建一个对象时。
Javascript中的数组只能包含索引数组的方法,而对象更多的是关联数组。
如果您将var b = [];
更改为var b = {};
,它将解决问题。
var b = {}
明确声明一个对象。
注意:如果您在上面的代码中为数组运算符提供非整数值,则会在表示数组的对象中创建属性,而不是数组元素。
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
- 如果value的[[Class]]内部属性为“Array”,则返回使用参数value调用JA抽象操作的结果。
- 否则,返回使用参数value调用JO抽象操作的结果。
给定您的数组,尽管向底层对象添加了参数,但结果是将数组元素的有序集合转换为字符串,而不是底层对象。
向数组对象添加参数没有问题,但它们不是数组的一部分,处理数组的函数或方法可能会忽略它们或任意处理它们。您已经看到JSON.stringify忽略了其他参数。其他函数可能会采取不同的方式处理它们-您将不得不在每种情况下找出。
虽然这样做并没有错,但如果您不向数组对象添加属性,则可能更容易理解。如果要添加属性,请从非数组对象开始。
而不是:
var b = [];
b['foo'] = 56;
b['bar'] = 78;
您可以使用以下方法:
var b = {};
b['foo'] = 56;
b['bar'] = 78;
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);