重学ES6之出来混迟早要还的三未写完版

本系列博客为ES6基础语法的使用及总结,如有错误,欢迎指正。
重学ES6之出来混迟早要还的(三)主要包括for of循环

for of循环

循环的几种方式

普通for循环

for(let i=0;i<arr.length;i++){
    //内容
}

forEach循环

1.forEach的使用

  • 格式

    arr.forEach(function (element,index,array) {
       console.log(element,index,array);
    })
  • forEach方法会自动调用传入的函数
  • 每次调用都会将当前遍历到的元素和当前遍历到的索引和当前被遍历的数组传递给这个函数

2.forEach注意点

  • forEach不能终止、不能跳过

for in循环

1.for in循环的使用

let arr = ['god','gosh','jesus','christ'];
for(let key in arr){
   console.log(key); //取出的是索引
   console.log(arr[key]); //取出的是值
}

2.for in循环的注意点

  • console.log(key); –> 取出的是索引
    console.log(arr[key]); –> 取出的是值
  • for in循环遍历的是对象上的所有可枚举属性(包括原型上面的属性)

    Array.prototype.des = function(){
     return this[0];
    };
    let arr = ['god','gosh','jesus','christ'];
    arr.title = 'words';
    for(let key in arr){
       console.log(key); //取出的是索引
       console.log(arr[key]); //取出的是值
    }

  • 在企业开发中不推荐使用for-in循环来遍历数组
  • 对象中的属性是无序的,for-in循环就是专门用于遍历无序的东西的

for-in循环是专门用于遍历对象的, 对象的属性是无序的, 所以for-in循环就是专门用于遍历无序的东西的, 因此不推荐使用forin循环来遍历数组

for of循环

1.使用格式

Array.prototype.des = function(){
 return this[0];
};
let arr = ['god','gosh','jesus','christ'];
arr.title = 'words';
for(let key of arr){
   console.log(key); //直接遍历的是值
}

2.注意点

  • console.log(key); –> 直接遍历的是值
  • 不会遍历原型上面的属性
  • 支持循环的终止和跳过

Object.keys() 方法遍历属性

1.用法

  • Object.keys()将一个对象中的属性名放到一个数组中;数组中每个元素类型为string
  • 数组中属性名的排列顺序和使用for…in 循环遍历该对象时返回的顺序一致。
  • 如果对象的键-值都不可枚举,那么将返回由键组成的数组。

遍历对象时:

let object1 = {
    a: 'somestring',
    b: 42,
    c: false
};

console.log(Object.keys(object1));
// expected output: Array ["a", "b", "c"]

遍历数组时:

// simple array
let arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']
console.log(typeof Object.keys(arr)[0]); //string

遍历类数组:

// array like object
let obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']

遍历对象时是无序的 (也就是上文所说的数组中属性名的排列顺序和使用for…in 循环遍历该对象时返回的顺序一致。)

// array like object with random key ordering
var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); // console: ['2', '7', '100']

2.Object.keys() 方法可以用来判断一个对象是否为空
利用Object.keys() 方法返回的数组,判断该数组长度是否为0;长度为0 则代表该对象为空;反之则不为空

let object1 = {
    a: 'somestring',
    b: 42,
    c: false
};
let keys = Object.keys(object1);
console.log(keys);
console.log(keys.length === 0); //false

for of循环的再探讨

1.for of循环可以用来遍历可迭代对象,在上一篇ES6语法文章中也提到了什么是可迭代对象

可迭代对象就是部署了Iterator接口,或者是定义了[Symbol.iterator]方法的数据结构,在ES6中Iterator接口主要供for of消费。

好,弟中弟中弟又要问了:什么是[Symbol.iterator],顺手放个参考链接

a zero arguments function that returns an object,conforming to the iterator protocol

2.entries() 方法
entries() 方法返回一个新的Array Iterator对象,该对象包含数组中每个索引的键/值对。

let arr = ['god','gosh','jesus','christ'];
for(let key of arr){
   console.log(key);
}

在控制台输入arr.entries(),返回一个新的Array Iterator对象

3.返回一个新的 Array 迭代器对象。Array Iterator是对象,它的原型(__proto__:Array Iterator)上有一个next方法,可用用于遍历迭代器取得原数组的[key,value]。

  • next方法每次执行都会返回一个对象{value: Array(2), done: false}
  • 这个对象中存储了当前取出的数据和是否取完了的标记,未取完标记是false,取完了标记是true


4.使用for of遍历arr.entries()(也就是它的iterator),返回的是一个数组,可以同时获取到原数组中每个索引的键/值对。

let arr = ['god','gosh','jesus','christ'];
for(let key of arr.entries()){
   console.log(key);
}


5.当然了,分开写分开获取也是可以的

let arr = ['god','gosh','jesus','christ'];
for(let key of arr.entries()){
   // console.log(key);
   console.log(key[0]); //获取索引
   console.log(key[1]); //获取属性值
}

可以利用解构赋值对处理键值完成后续操作

let arr = ['god','gosh','jesus','christ'];
for(let [index,value] of arr.entries()){
   // console.log(key);
   // console.log(key[0]); //获取索引
   // console.log(key[1]); //获取属性值
   console.log((`第${index + 1}个单词是${value}`));
}

6.for of循环可以用Array/Map/Set/String/TypedArray/arguments 对象/NodeList对象。因此在遍历时不需要考虑是否可以使用哪种循环,for of可以解决这些场景;但是for of循环不支持对象的遍历

function sum() {
    let count = 0;
    for (let key of arguments){
        count = count + key;
    }
    return count;
}
console.log(sum(1, 2, 3, 4, 5, 6, 7, 8));

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理