for...in... 和 Object.keys(), JSON.stringify() 顺序

下面三种方法能保证我们看见的顺序么?

  1. for...in...
  2. Object.keys()
  3. JSON.stringify()

答案:都不能



接下来看一个例子:

输出:

可以看到,数字类型的 key 做了排序,字符串类型的按照书面类型排序,最后是 Symbol 类型
且 三种方法 的遍历顺序是一样的,而且都忽略了 Symbol 类型。

那么,到底是什么规则呢?

  1. 声明变量keys值为一个空列表(List类型)
  2. 把每个Number类型的属性,按数值大小升序排序,并依次添加到keys中
  3. 把每个String类型的属性,按创建时间升序排序,并依次添加到keys中
  4. 把每个Symbol类型的属性,按创建时间升序排序,并依次添加到keys中
  5. 将keys返回(return keys)

上面这个规则不光规定了不同类型的返回顺序,还规定了如果对象的属性类型是数字,字符与Symbol混合的,那么返回顺序永远是数字在前,然后是字符串,最后是Symbol。

属性的顺序规则中虽然规定了Symbol的顺序,但其实Object.keys最终会将Symbol类型的属性过滤出去。(原因是顺序规则不只是给Object.keys一个API使用,它是一个通用的规则, 通用规则中不包含 Symbol 类型)

上述 keys 是个 List 类型,需要转化为 Array 类型:

  1. 先声明一个变量array,值是一个空数组
  2. 循环属性列表,将每个元素添加到array中
  3. 将array返回
上面介绍的排序规则同样适用于下列API:
  • Object.entries
  • Object.values
  • for...in循环
  • Object.getOwnPropertyNames
  • Reflect.ownKeys

注意:以上API除了Reflect.ownKeys之外,其他API均会将Symbol类型的属性过滤掉。



扩展:
我们知道,for...in 是可以遍历原型链上的可枚举属性的

输出:


可以看到,先遍历自身元素,再遍历父元素,而且对自身和父元素各自应用上述规则
需要注意的是自身和父元素的同名元素,父元素的同名元素自动忽略



输出:


以下报错 TypeError:

知道为什么是 ['0', '1', '2', '3', '4'] 了吧



具体参考文章:
https://mp.weixin.qq.com/s?__biz=MzA5NzkwNDk3MQ==&mid=2650587762&idx=1&sn=0b9fc52be79943be1f37005d231a1529&chksm=8891d256bfe65b40ae4ae66cefcf262dd5e4382b6dbcf891eaea1c36e4b9519723cacb196975&scene=0#rd

你可能感兴趣的:(for...in... 和 Object.keys(), JSON.stringify() 顺序)