数组遍历

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属性。