JavaScript 中 Object.keys 的返回值是无序的吗?

2024-08-03 17:36:45 169
在 JavaScript 中,`Object.keys` 返回的键的顺序不是完全无序的,但它并不总是按预期的顺序。ES6 规范对对象属性的顺序做了一些定义,具体来说,`Object.keys` 返回的键顺序遵循以下规则:
  1. 整数索引属性:按升序排序。
  2. 字符串键属性:按添加顺序排列,但在整数索引属性之后。
  3. Symbol 键属性:按添加顺序排列,但在字符串键属性之后。

示例代码

让我们通过代码示例来看一下 Object.keys 返回键的顺序:

const obj = {
  2: 'two',
  1: 'one',
  b: 'bee',
  a: 'aye',
  3: 'three',
  [Symbol('sym')]: 'symbol'
};

console.log(Object.keys(obj)); 
// 输出: ["1", "2", "3", "b", "a"]

在这个例子中,Object.keys 返回了键 ["1", "2", "3", "b", "a"],顺序如下:

  1. 整数索引属性:1, 2, 3(按升序排序)
  2. 字符串键属性:b, a(按添加顺序)
  3. Symbol 键属性:不包括在 Object.keys 的返回值中,因为它们是 Symbol 键。

更详细的说明

  1. 整数索引属性

    • 按升序排序。
    • 整数索引是指可以转换为 32 位无符号整数的字符串(即介于 0 到 2^32-1 之间的整数)。
  2. 字符串键属性

    • 按添加顺序排列。
    • 排在所有整数索引属性之后。
  3. Symbol 键属性

    • 不包括在 Object.keys 的返回值中。

再举一个例子

const obj = {
  a: 'first',
  3: 'three',
  b: 'second',
  1: 'one',
  2: 'two',
  c: 'third'
};

console.log(Object.keys(obj));
// 输出: ["1", "2", "3", "a", "b", "c"]

在这个例子中,Object.keys 返回的键顺序是 ["1", "2", "3", "a", "b", "c"]:

  1. 整数索引属性:1, 2, 3(按升序排序)
  2. 字符串键属性:a, b, c(按添加顺序)

结论

Object.keys 返回的键是有序的,按整数索引属性升序排列,其次是按添加顺序排列的字符串键属性。然而,这个顺序可能不会总是符合直觉,因此在使用时要理解它的行为。