一尘不染

如何确定性地验证未修改JSON对象?

json

根据MDN的JSON.stringify文档

非数组对象的属性不能保证以任何特定顺序进行字符串化。不要依赖于字符串化中同一对象内属性的顺序。

我曾希望通过缓存该对象的字符串化版本,然后将其与该对象的后续字符串化版本进行比较来确定对象是否发生了更改。这似乎比递归遍历对象并进行比较要简单得多。问题在于,由于JSON.stringify函数不是确定性的,因此在对同一对象进行字符串化时,从技术上讲我可以得到不同的字符串。

我还有什么其他选择?还是我必须编写一个讨厌的比较函数来确定对象是否相等?


阅读 208

收藏
2020-07-27

共1个答案

一尘不染

我很确定这是由于不同的JavaScript引擎在内部跟踪对象属性的方式所致。以这个为例:

var obj = {
"1" : "test",
"0" : "test 2"
};

for(var key in obj) {
    console.log(key);
}

这将在Firefox中记录1、0,但在V8(Chrome和NodeJS)中记录0、1。因此,如果需要确定性,则可能必须遍历将每个键存储在数组中,对数组进行排序,然后通过遍历该数组分别对每个属性进行字符串化。

2020-07-27