Object.keys(obj)

返回一个由给定对象的自身可枚举属性组成的数组,这些属性的顺序与手动遍历该对象属性时一致

  1. // 数组
  2. Object.keys([0, 1, 2]) // ["0", "1", "2"] 这里返回的其实是下标组成的数组
  3. // 类似数组的对象,且顺序与正常数组下标一致
  4. Object.keys({0: 0, 1: 1, 2: 2}) // ["0", "1", "2"]
  5. // 类似数组的对象,顺序打乱
  6. Object.keys({100: 'a', 1: 'b', 2: 'c', 10: 'd'}) // ["1", "2", "10", "100"]

Array.prototype.keys()

返回一个包含数组中每个索引键的 Array Iterator 对象

  1. [0, 1, 2].keys() // Array Iterator {}
  2. [...Array(100).keys()] // [0, 1, 2,..., 99]

遍历的顺序问题

由于Object.key()遍历的属性的顺序与手动遍历(for…in)一致,而 for…in 是以任意顺序遍历对象的除Symbol以外的可枚举属性

为什么不要使用 for…in 遍历数组

因为数组是特殊对象,数组的索引其实可以看做这个特殊对象的属性,且他们是有序的,但是 for…in 不能保证遍历时能够按照数组的索引顺序,所以不要使用for…in 遍历数组;
所以迭代访问顺序很重要的数组时,最好使用整数索引去进行for循环或者Array.prototype.forEach()、for…of

for…of 与 for…in

  • for...of是遍历可迭代对象定义的要迭代的数据
  • for...in 是以任意顺序遍历对象的除Symbol以外的可枚举属性 ```javascript let arr = [3, 4, 5] // 这里定义了要迭代的数据 arr.test = ‘haha’ // test属性的值不需要迭代

// 使用for..of,只遍历需要迭代的数据 for (let i of arr) { console.log(i) } // 0 // 1 // 2

// 使用for…in for (let i in arr) { console.log(i) } // 0 // 1 // 2 // test ```