面对奇怪的方法行为Object.fromEntries
有以下代码:
const obj = { 0: 6, 1: 7, 2: 8, 3: 3, 4: 4, 5: 5, 6: 0, 7: 1, 8: 2 };
const res = Object.fromEntries(
Object.entries(obj)
.map( ([key, value]) => [value, +key] )
);
console.log(JSON.stringify(res) === JSON.stringify(obj)); // true
/*
obj { 0: 6, 1: 7, 2: 8, 3: 3, 4: 4, 5: 5, 6: 0, 7: 1, 8: 2 }
res { 0: 6, 1: 7, 2: 8, 3: 3, 4: 4, 5: 5, 6: 0, 7: 1, 8: 2 }
*/
只有这里是对象,对它的引用在变量res中,和原来的一样
有人可以解释这里发生了什么吗?我在规范中没有找到任何关于此的信息。谢谢!
选择对象中的键和值,这样当它们相互交换时,键列表和值列表不会改变。
实际上,整个检查取决于
JSON.stringify编译字符串时如何传递属性。让我们转向规范:当
JSON.stringify不带参数调用时replacer,这space一切都归结为执行一个内部函数SerializeJSONProperty,当前状态被传递到该函数中,序列化开始的键(一个空字符串,参数)和一个代表自身key的存根对象(参数)holdervalue传递给的对象在哪里JSON.stringify。在函数
SerializeJSONProperty中,根据规则,如果holder[key]是对象,则执行到SerializeJSONObject这里,在第 5 和第 6 段中,确定了属性遍历的顺序。对于问题中的情况,未指定属性列表,因此在函数中确定顺序,该函数
EnumerableOwnPropertyNames根据输出列出键[[OwnPropertyKeys]](有关算法的更多详细信息,请参阅问题的答案How do a FOR IN循环遍历数组?对于问题中的情况:遍历是按升序对数字键进行的。由于键列表相同,因此结果也相同。