Javascript数组对象与数组类似对象 - 澄清

Sel*_*gam 6 javascript arrays json associative-array object

我试图将声明为数组对象的类似数组的对象进行字符串化,并发现JSON.stringify在定义为数组对象时未正确处理类似数组的对象.

请参阅下面的更清晰, - > jsFiddle

var simpleArray = []; //note that it is defined as Array Object 

alert(typeof simpleArray); // returns object -> Array Object

simpleArray ['test1'] = 'test 1';
simpleArray ['test2'] = 'test 2';

alert(JSON.stringify(simpleArray)); //returns [] 
Run Code Online (Sandbox Code Playgroud)

它工作正常,{"test1":"test 1","test2":"test 2"}当我改变时回来了

var simpleArray = [];var simpleArray = {};.

有人可以提供一些亮点或一些参考,我可以阅读更多?

编辑:

问题:当typeof simpleArray = []simpleArray = {}返回的对象时,为什么JSON.stringify {"test1":"test 1","test2":"test 2"}在两种情况下都无法返回?

Dar*_*rov 5

区别在于索引。当您使用数组时,[]索引只能是正整数。

所以下面的说法是错误的:

var array = [ ];
array['test1'] = 'test 1';
array['test2'] = 'test 2';
Run Code Online (Sandbox Code Playgroud)

因为test1test2不是整数。为了修复它,您需要使用基于整数的索引:

var array = [ ];
array[0] = 'test 1';
array[1] = 'test 2';
Run Code Online (Sandbox Code Playgroud)

或者如果你声明一个 javascript 对象,那么属性可以是任何字符串:

var array = { };
array['test1'] = 'test 1';
array['test2'] = 'test 2';
Run Code Online (Sandbox Code Playgroud)

这相当于:

var array = { };
array.test1 = 'test 1';
array.test2 = 'test 2';
Run Code Online (Sandbox Code Playgroud)

  • @MattFenwick,发生的情况与您的预期相反:“simpleArray.length = 0”,这意味着该数组中没有元素。您仍然可以使用“simpleArray.test2”来访问您定义的属性。这只是应该避免的令人困惑的代码。 (3认同)

Mat*_*hen 2

你不需要数组。当您想要 JavaScript 中的“关联数组”时,您实际上需要一个对象,{}.

您可以通过以下方式区分它们instanceof Array

[] instanceof Array // true
({}) instanceof Array // false
Run Code Online (Sandbox Code Playgroud)

编辑:它可以处理它。它序列化数组的所有元素。然而,作为一个元素,必须有一个数字键。在这种情况下,没有。

这并不是 JSON 独有的。toSource与和属性一致length