美文网首页
你不知道的for-in和for-of

你不知道的for-in和for-of

作者: youngiyang_打码少年 | 来源:发表于2016-09-08 13:53 被阅读62次

1.for-in

for-in是for循环的一个变体,它可以把一个对象的所有属性依次遍历出来,如:

var o = {
    name: 'Jack',
    age: 20,
    city: 'Beijing'
};
for (var key in o) {
    alert(key); // 'name', 'age', 'city'
}
var a = ['A', 'B', 'C'];
for (var i in a) {
    alert(i); // '0', '1', '2' 注意,这里的得到的结果是srting
    alert(a[i]); // 'A', 'B', 'C'
}

2.for-of

for-of是ES6引入的新语法,谈到for-of,就先来谈谈ES6引入的新类型iterable,因为只有具有iterable类型的集合才可以通过新的for ... of循环来遍历。

Array、Map和Set都属于iterable类型

Map类型
Map是一组键值对的结构,具有极快的查找速度。
举个例子,假设要根据同学的名字查找对应的成绩,如果用Array实现,需要两个Array:

var names = ['Michael', 'Bob', 'Tracy'];
var scores = [95, 75, 85];

给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,Array越长,耗时越长。
如果用Map实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用JavaScript写一个Map如下:

var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
m.get('Michael'); // 95

Set类型
Set和Map类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。
重复元素在Set中自动被过滤:



var s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"}

3.for ... of循环和for ... in循环有何区别?

for ... in循环由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。

当我们手动给Array对象添加了额外的属性后,for ... in循环仍然会去遍历这个新的属性:

var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
    alert(x); // '0', '1', '2', 'name'
}

但是for...of只会循环集合的本身

var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x of a ) {
    alert(x); // 'A', 'B', 'C'

}

另外从返回结果来看,一个返回对象属性的值,一个返回对象的元素。
4.最好的解决方案
iterable有个内置方法:forEach,它接受一个匿名函数,每次迭代就自动回调该函数。
以array为例子:

var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
    // element: 指向当前元素的值
    // index: 指向当前索引
    // array: 指向Array对象本身
    alert(element);
});

以Set为例子,Set没有索引,所以前两个参数都是元素本身

var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
    alert(element);
})

以Map为例子,Map的回调函数参数依次为value、key和map本身:

var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
    alert(value);
});

相关文章

  • for-in 和 for-of

    先来看下结果1.for in 对数组(Array)的遍历 2.for in 对对象(Object)的遍历 3.fo...

  • 你不知道的for-in和for-of

    1.for-in for-in是for循环的一个变体,它可以把一个对象的所有属性依次遍历出来,如: 2.for-o...

  • for-of循环

    ES6为我们提供了for-in循环和for-Each循环还要强大 之前的for-in循环 for-of循环 遍历数...

  • JS 循环 OR 数组遍历

    while OR do-while for forEach for-in for-of map filter so...

  • forEach、for-in、for-of

    1.forEach 遍历范围:数组; 回调函数提供三个参数:当前元素item、当前索引index、当前操作的数组a...

  • JavaScript 笔记02(js 循环 / 函数参数 / j

    JavaScript 笔记02 接笔记01 5.for / forEach / for-in / for-of 不...

  • for-of

    for-of方法: for-of的语法看起来跟for-in很相似,但它的功能却丰富的多,它能循环很多东西。 for...

  • js 循环有哪些?

    js 循环有哪些? for / for-in / for-of / foreach 专门为循环设计 map / f...

  • for-of和for-in的用法和区别

    参考 MDN[https://developer.mozilla.org/zh-CN/docs/Web/JavaS...

  • 遍历

    总结 从遍历数组的效率上来讲普通for循环 >= forEach > for-of > for-in forEac...

网友评论

      本文标题:你不知道的for-in和for-of

      本文链接:https://www.haomeiwen.com/subject/nzmsettx.html