重撸Js中的遍历

198 阅读2分钟

第一版

1、for 循环

for (let i = 0; i < 10; i++) {
  console.log(i); 
}

2、for in 遍历 key:val

let obj = { age: 1, name: "stank1", school: "shanghai" };
for (let i in obj) {
  // console.log(i); //key
  // console.log(obj[i]);//val
  if (obj.hasOwnProperty(i)) {
    //hasOwnProperty是否为自身的属性
    console.log(i);
    console.log(obj[i]);
  }
}

3、 for of

  • 可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句 //- obj 是不可迭代
let arr = [1, 2, 3, 4, 5];
obj = { name: "Json", [Symbol("1")]: 9527, [Symbol("2")]: 9528, age: 12 };
for (let i of arr) {
  console.log(i);
}
for (let k of obj) {
  console.log(k); //obj is not iterable
}

官方地址

4、map()

  • 给原数组中的每个元素都按顺序调用一次 callback 函数。callback 每次执行后的返回值(包括 undefined)组合起来形成一个新数组
  • let newArray = arr.map(callback(currentValue, index, array) {
    // Return element for newArray
    }, thisArg)
  • 返回值:newArr
let arr = [1, 2, 3, 4];
let newArr = arr.map((item, index, arr) => {
  // console.log(item,index,arr);
  return (item += 1);
});
console.log(arr, newArr);
["1", "2", "3"].map((str) => parseInt(str));
["1", "2", "3"].map((str) => Number(str)); [1,2,3]

5、forEach()

  • 对数组的每个元素执行一次给定的函数
  • arr.forEach(callback(currentValue , index , array), thisArg)
  • 返回值:undefined
let arr = [1, 2, 3, 4];
let newArr = arr.forEach((item, index, arr) => {
  console.log(item, index, arr);
  return (item += 1);
});
console.log(arr, newArr);

6、filter()

  • 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
  • let newArray = arr.filter(callback(element, index, array), thisArg) -返回值: 一个新的、满足条件的元素组成的数组,如果没有任何数组元素满足条件,则返回空数组。
let arr = [1, 2, 3, 4, 5];
let newArray = arr.filter((item) => {
  return item <= 2;
});
console.log(arr, newArray);//[1, 2, 3, 4, 5] false

7、every()

  • 方法测试一个数组内的所有元素是否都能通过某个指定函数的测试
  • arr.every(callback(element, index, array), thisArg) -返回值: 如果回调函数的每一次返回都为 truthy 值,返回 true ,否则返回 false
  • 返回值:truthy(真值)指的是在布尔值上下文中,转换后的值为真的值。所有值都是真值,除非它们被定义为 假值(即除 false、0、""、null、undefined 和 NaN 以外皆为真值)
let arr = [1, 2, 3, 4, 5];
let newArray = arr.every((item) => {
  return item <= 2;
});
console.log(arr, newArray); //[1, 2, 3, 4, 5] false

8、some()

  • 方法测试数组中是不是至少有 1 个元素通过了被提供的函数测试。
  • arr.some(callback(element, index, array), thisArg)
  • 返回值:Boolean
let arr = [1, 2, 3, 4, 5];
let newArray = arr.some((item) => item >= 5);
console.log(newArray); // true

9、while

  • 先循环,直到条件为 true 时停止循环
  • while (条件) 逻辑
let a = 0;
let b = 0;

while (a < 2) {
  a++;
  b += a;
  console.log(a, b);
}

10、do while

  • 至少执行 1 遍
  • do{逻辑} while (条件)
let a = 0;
let b = 0;

do {
  a++;
  b += a;
  console.log(a, b);
} while (a < 0);

11、Object.keys()

  • 要返回其枚举自身属性的对象
  • Object.keys(obj)
  • 返回值:自身属性 list
let obj = { age: 1, name: "stank1", school: "shanghai" };
console.log(Object.keys(obj)); //[ 'age', 'name', 'school' ]

12、Object.getOwnPropertyNames()

  • 返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括 Symbol 值作为名称的属性)组成的数组
  • Object.getOwnPropertyNames(obj)
  • 返回值:包括不可枚举属性但不包括 Symbol 值作为名称的属性 list
let obj = { age: 1, name: "stank1", school: "shanghai" };
let arr = ["a", "b", "c"];
console.log(Object.getOwnPropertyNames(obj)); //[ 'age', 'name', 'school' ]
console.log(Object.getOwnPropertyNames(arr)); //[ '0', '1', '2', 'length' ]

13、Object.getOwnPropertySymbols()

  • 返回一个给定对象自身的所有 Symbol 属性的数组
  • Object.getOwnPropertySymbols(obj)
  • 返回值:给定对象自身上找到的所有 Symbol 属性的数组
let obj = { name: "Json", [Symbol("1")]: 9527, [Symbol("2")]: 9528, age: 12 };
console.log(Object.getOwnPropertySymbols(obj)); //[ Symbol(1), Symbol(2) ]

14、.Reflect.ownKeys

  • 返回一个由目标对象自身的属性键组成的数组
  • 返回值:返回值等同于 Object.getOwnPropertyNames(target).concat(ObjectgetOwnPropertySymbols(target))
let obj = { name: "Json", [Symbol("1")]: 9527, [Symbol("2")]: 9528, age: 12 };
console.log(Reflect.ownKeys(obj)); //[ 'name', 'age', Symbol(1), Symbol(2) ]

参考MD官方地址