Javascript-当键名具有数字值时,JSON.parse()是否真的对属性进行排序?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Javascript-当键名具有数字值时,JSON.parse()是否真的对属性进行排序?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3133字,纯文字阅读大概需要5分钟。
内容图文
![Javascript-当键名具有数字值时,JSON.parse()是否真的对属性进行排序?](/upload/InfoBanner/zyjiaocheng/666/79eaf4bc8c894c94894391a5ce6668d4.jpg)
这里有很多关于这个问题的文章,它们都包含很多断言,可以总结如下:
>决不能保证对象属性以任何方式排序.
> JSON.parse()绝不对属性进行任何排序.
显然,我们对上面的#1毫无疑问,因此我们可以合理地预期,对于任何操作,属性仅按照它们出现的顺序进行处理.
[编辑,按照@Bergi的评论:或者至少它们应该以随机顺序出现]
然后,我们可以由此特别推断出#2应该是正确的.
但是请看以下代码片段:
(顺便说一句:为了显示结果,下面的代码片段不使用console.log()本身可能会更改输出的顺序.相反,对象通过for(在obj中的键)进行迭代,并且输出显示在文档中)
var inputs = [
'{"c": "C", "a": "A", "b": "B"}',
'{"3": "C", "1": "A", "2": "B"}',
'{"c": "C", "a": "A", "3": "C", "1": "A", "b": "B", "2": "B"}'
];
for (var i in inputs) {
var json = inputs[i],
parsed = JSON.parse(json),
output = [];
for (var j in parsed) {
output.push(j + ': ' + parsed[j]);
}
document.write(`JSON: ${json}<br />Parsed: ${output.join(', ')})<hr />`);
}
它显示,给定一个具有无序键的JSON字符串:
>当输入的键具有非数字值时,解析对象的属性与输入中的顺序相同.这与上面的#2假设一致.
>相反,当输入的键具有数字值时(尽管它们是字符串,因此不会引发解析错误),则解析对象的属性将进行排序.现在,这与第二个假设相矛盾.
>更多:当数字键值和非数字键值混合在一起时,首先显示已排序的数字属性,然后按原始顺序显示非数字属性.
因此,我首先想得出一个结论,那就是实际上会有(未记录的?)功能,因此JSON.parse()遵循上面公开的“规则”工作.
但是我有进一步研究的想法,因此下面的代码片段显示了仅编码对象的属性的排序方式:
var objects = [
[
'{"c": "C", "a": "A", "b": "B"}',
{"c": "C", "a": "A", "b": "B"}
],
[
'{"3": "C", "1": "A", "2": "B"}',
{"3": "C", "1": "A", "2": "B"}
],
[
'{"c": "C", "a": "A", "3": "C", "1": "A", "b": "B", "2": "B"}',
{"c": "C", "a": "A", "3": "C", "1": "A", "b": "B", "2": "B"}
]
];
for (var i in objects) {
var object = objects[i],
output = [];
for (var j in object[1]) {
output.push(j + ': ' + object[1][j]);
}
document.write(`Code: ${object[0]}<br />Object: ${output.join(', ')}<hr />`);
}
它会产生类似的观察结果,即按照它们的编码顺序,将按照上面的第三条规则存储属性:
>以数字命名的属性都放在首位,进行排序
>接下来设置其他属性,按编码顺序
因此,这意味着不涉及JSON.parse():实际上,这似乎是对象构建的基本过程.
再次,这似乎没有记录,至少在我能找到的地方.
关于真正权威的规则有什么线索吗?
[编辑,感谢@Oriol的回答]实际上,综合看来:
>此行为符合ECMA specification rule.
>此规则应适用于保证特定顺序但对其他情况是可选的所有方法.
>但是,似乎现代的浏览器都会选择采用规则,无论涉及哪种方法,因此都存在明显的矛盾.
解决方法:
对象的属性没有顺序,因此JSON.parse不能对它们进行排序.但是,当您列出或枚举对象的属性时,顺序可能没有明确定义.
不一定是for … in循环或Object.keys
正如Does ES6 introduce a well-defined order of enumeration for object properties?中充分说明的那样,spec表示
The mechanics and order of enumerating the properties is not specified
但是对于OrdinaryOwnPropertyKeys是
对象具有内部的[[OwnPropertyKeys]]方法,例如,Object.getOwnPropertyNames和Object.getOwnPropertySymbols使用该方法.
对于普通对象,该方法使用OrdinaryGetOwnProperty抽象操作,该操作以明确定义的顺序返回属性:
When the abstract operation OrdinaryOwnPropertyKeys is called with
Object O, the following steps are taken:
- Let keys be a new empty 07003.
- For each own property key P of O that is an integer index, in
ascending numeric index order
内容总结
以上是互联网集市为您收集整理的Javascript-当键名具有数字值时,JSON.parse()是否真的对属性进行排序?全部内容,希望文章能够帮你解决Javascript-当键名具有数字值时,JSON.parse()是否真的对属性进行排序?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。