Javascript的JSON.stringify不接受键索引(关联)数组?

Roc*_*uts 4 javascript arrays json object stringify

在JavaScript中,您可以拥有对象,如下所示:

var a = { foo: 12, bar: 34 };
Run Code Online (Sandbox Code Playgroud)

或者带有键(命名)索引的数组,如下所示:

var b = [];
b['foo'] = 56;
b['bar'] = 78;
Run Code Online (Sandbox Code Playgroud)

它们有点类似,但显然不一样.

现在奇怪的是,JSON.stringify似乎没有接受数组.没有错误或任何东西,JSON.stringify(b)只会产生[].

看到这个jsfiddle示例.我做错了什么,或者我只是误解了数组是如何工作的?

Lin*_*ial 5

Javascript不支持关联数组(如PHP).

var b = []; 当您尝试创建Object时,显式声明一个数组.

Javascript中的数组只能包含数组的索引方法,而对象则更多是关联数组.

如果更改var b = [];var b = {};它将解决问题.

var b = {} 明确声明一个Object.


Ian*_*Ian 5

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

  • 如果 value 的 [[Class]] 内部属性是“Array”,则返回调用带有参数值的抽象操作 JA 的结果。
  • 否则,返回调用带有参数值的抽象操作 JO 的结果。

给定您的数组,尽管向底层对象添加了参数,但结果是对数组元素的有序集进行字符串化,而不是底层对象。

向数组对象添加参数并没有错,但它们不是数组的一部分,处理数组的函数或方法可能会忽略它们或随意处理它们。您已经看到 JSON.stringify 忽略了附加参数。其他函数可能会这样做 - 您必须在每种情况下找出答案。

虽然没有错,但如果不向数组对象添加属性可能会更容易理解。如果要添加属性,请从非数组对象开始。

而不是:

var b = [];
b['foo'] = 56;
b['bar'] = 78;
Run Code Online (Sandbox Code Playgroud)

你可能会使用:

var b = {};
b['foo'] = 56;
b['bar'] = 78;
Run Code Online (Sandbox Code Playgroud)