乐趣区

JS数组和对象的遍历

数组遍历

forEach

let arr = ['foo', 'bar', 'baz'];
arr.forEach((item, index) => {console.log(index + ',' + item);
});
// 0,foo
// 1,bar
// 2,baz
  • forEach循环无奈通过 breakreturn跳出循环。

for…in

let arr = ['foo', 'bar', 'baz'];
for (let i in arr) {console.log(i + ',' + arr[i]);
}
// 0,foo
// 1,bar
// 2,baz
  • for...in循环只能用来遍历键名,然而能够遍历出非数值类型的键名,而且可能会以任意程序遍历键名,不实用数组,实用于对象。

for…of

let arr = ['foo', 'bar', baz'];
for (let i of arr) {console.log(i);
}
// foo
// bar
// baz
  • for...of循环间接遍历数组的元素,并且能够通过 breakreturn手动跳出循环;只有部署了 Iterator 的数据结构能力应用。

对象遍历

Object.keys()、Object.values()、Object.entries()

const obj = { 
  name: "小米", 
  id: 1, 
  price: 3999,
  [Symbol.for('num')]: 50
};
Object.defineProperty(obj, 'discount', {
  value: 8,
  writable: false,
  enumerable: false,
  configurable: false
});
Object.keys(obj); // [name, id, price]
Object.values(obj); // ['小米', 1, 3999]
Object.entries(obj); // [["name", "小米"], ["id", 1], ["price", 3999]]
  • Object.keys()会返回对象的所有键名,Object.values()返回对象的所有属性值,Object.entries()返回对象的属性和属性值键值对数组,这三个办法都不能返回不可枚举和 Symbol 属性。

for…in

const obj = { 
  name: "小米", 
  id: 1, 
  price: 3999,
  [Symbol.for('num')]: 50
};
Object.defineProperty(obj, 'discount', {
  value: 8,
  writable: false,
  enumerable: false,
  configurable: false
});
for (let i in obj) {console.log(obj[i]); // '小米' 1 3999
}
  • for...in遍历对象不会返回 Symbol 和不可枚举属性。

Object.getOwnPropertyNames

const obj = { 
  name: "小米", 
  id: 1, 
  price: 3999,
  [Symbol.for('num')]: 50
};
Object.defineProperty(obj, 'discount', {
  value: 8,
  writable: false,
  enumerable: false,
  configurable: false
});
Object.getOwnPropertyNames(obj); // [name, id, price, num]
  • Object.getOwnPropertyNames办法返回对象内除 Symbol 以外的所有属性名。

Object.getOwnPropertySymbols

const obj = { 
  name: "小米", 
  id: 1, 
  price: 3999,
  [Symbol.for('num')]: 50
};
Object.defineProperty(obj, 'discount', {
  value: 8,
  writable: false,
  enumerable: false,
  configurable: false
});
Object.getOwnPropertySymbols(obj); // []
  • Object.getOwnPropertySymbols办法返回对象外部的所有 Symbol 属性。

Reflect.ownKeys

const obj = { 
  name: "小米", 
  id: 1, 
  price: 3999,
  [Symbol.for('num')]: 50
};
Object.defineProperty(obj, 'discount', {
  value: 8,
  writable: false,
  enumerable: false,
  configurable: false
});
Reflect.ownKeys(obj); // ['name', 'id', 'price', 'discount', Symbol(num)]
  • Reflect.ownKeys办法返回对象外部所有属性名,包含不可枚举属性和 Symbol 属性。
退出移动版