我注意到JSON对象中元素的顺序不是原始顺序 .
那些JSON列表的元素呢?他们的订单是否保持?
实际上,如果密钥是NaN类型,浏览器将不会更改顺序 .
以下脚本将输出“One”,“Two”,“Three”:
var foo={"3":"Three", "1":"One", "2":"Two"}; for(bar in foo) { alert(foo[bar]); }
以下脚本将输出“Three”,“One”,“Two”:
var foo={"@3":"Three", "@1":"One", "@2":"Two"}; for(bar in foo) { alert(foo[bar]); }
是的,保留了JSON数组中元素的顺序 . 来自RFC 7159 -The JavaScript Object Notation (JSON) Data Interchange Format(强调我的):
对象是零个或多个名称/值对的无序集合,其中名称是字符串,值是字符串,数字,布尔值,空值,对象或数组 . 数组是零个或多个值的有序序列 . 术语“对象”和“数组”来自JavaScript的约定 .
保持数组中元素的顺序( [] ) . "object"( {} )中的元素(名称:值对)的顺序不是,并且它们通常是"jumbled",如果不是JSON格式化程序/解析器本身,那么特定于语言的对象(Dictionary,NSDictionary,Hashtable)等)用作内部表示 .
[]
{}
一些JavaScript引擎将密钥保持在插入顺序中 . 例如,V8,keeps all keys in insertion order except for keys that can be parsed as unsigned 32-bit integers .
这意味着如果您运行以下任一项:
var animals = {}; animals['dog'] = true; animals['bear'] = true; animals['monkey'] = true; for (var animal in animals) { if (animals.hasOwnProperty(animal)) { $('<li>').text(animal).appendTo('#animals'); } }
var animals = JSON.parse('{ "dog": true, "bear": true, "monkey": true }'); for (var animal in animals) { $('<li>').text(animal).appendTo('#animals'); }
在使用V8的Chrome上,您将始终按顺序获得狗,熊和猴子 . Node.js也使用V8 . 即使你有数以千计的物品,这也是正确的 . YMMV与其他JavaScript引擎 .
演示here和here .
“是否维护了JSON列表中元素的顺序?”这不是一个好问题 . 您需要询问“在执行[...]时是否保留了JSON列表中元素的顺序?”正如Felix King所指出的,JSON是一种文本数据格式 . 没有理由它不会变异 . 不要将JSON字符串与(JavaScript)对象混淆 .
你可能在谈论像 JSON.stringify(JSON.parse(...)) 这样的操作 . 现在答案是:这取决于实施 . 99%*的JSON解析器不维护对象的顺序,并且保持数组的顺序,但您也可以使用JSON来存储类似的东西
JSON.stringify(JSON.parse(...))
{ "son": "David", "daughter": "Julia", "son": "Tom", "daughter": "Clara" }
并使用维护对象顺序的解析器 .
*可能更多:)
5 回答
实际上,如果密钥是NaN类型,浏览器将不会更改顺序 .
以下脚本将输出“One”,“Two”,“Three”:
以下脚本将输出“Three”,“One”,“Two”:
是的,保留了JSON数组中元素的顺序 . 来自RFC 7159 -The JavaScript Object Notation (JSON) Data Interchange Format(强调我的):
保持数组中元素的顺序(
[]
) . "object"({}
)中的元素(名称:值对)的顺序不是,并且它们通常是"jumbled",如果不是JSON格式化程序/解析器本身,那么特定于语言的对象(Dictionary,NSDictionary,Hashtable)等)用作内部表示 .一些JavaScript引擎将密钥保持在插入顺序中 . 例如,V8,keeps all keys in insertion order except for keys that can be parsed as unsigned 32-bit integers .
这意味着如果您运行以下任一项:
在使用V8的Chrome上,您将始终按顺序获得狗,熊和猴子 . Node.js也使用V8 . 即使你有数以千计的物品,这也是正确的 . YMMV与其他JavaScript引擎 .
演示here和here .
“是否维护了JSON列表中元素的顺序?”这不是一个好问题 . 您需要询问“在执行[...]时是否保留了JSON列表中元素的顺序?”正如Felix King所指出的,JSON是一种文本数据格式 . 没有理由它不会变异 . 不要将JSON字符串与(JavaScript)对象混淆 .
你可能在谈论像
JSON.stringify(JSON.parse(...))
这样的操作 . 现在答案是:这取决于实施 . 99%*的JSON解析器不维护对象的顺序,并且保持数组的顺序,但您也可以使用JSON来存储类似的东西并使用维护对象顺序的解析器 .
*可能更多:)