JavaScript基础-Iterable(Map/Set/在Iterable中遍历)

来源:

廖雪峰-JavaScript教程-快速入门-Map和Set
廖雪峰-JavaScript教程-快速入门-Iterable
/* 和廖老师的一样,只是加粗了一些重点 */

Map/Set/Iterable

Map(ES6,二维数组)

  • JavaScript的默认对象表示方式{} 可以视为其他语言中的Map或Dictionary的数据结构,即一组键值对。

  • 但是JavaScript的对象有个小问题,就是键必须是字符串。但实际上Number或者其他数据类型作为键也是非常合理的。

  • 为了解决这个问题,最新的ES6规范引入了新的数据类型Map。要测试你的浏览器是否支持ES6规范,请执行以下代码,如果浏览器报ReferenceError错误,那么你需要换一个支持ES6的浏览器:

'use strict';
var m = new Map();
var s = new Set();
console.log('你的浏览器支持Map和Set!');
  • Map是一组键值对的结构,具有极快的查找速度

  • 如果用Map实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用JavaScript写一个Map如下:

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

初始化Map需要一个二维数组,或者直接初始化一个空Map。Map具有以下方法:

var m = new Map(); // 空Map
m.set('Adam', 67); // 添加新的key-value
m.set('Bob', 59);
m.has('Adam'); // 是否存在key 'Adam': true
m.get('Adam'); // 67
m.delete('Adam'); // 删除key 'Adam'
m.get('Adam'); // undefined

Set(ES6,一个[])

  • Set和Map类似, 也是一组key的集合,但不存储value 。由于key不能重复,所以,在Set中,没有重复的key。

  • 要创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set

var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3]); // 含1, 2, 3
  • 重复元素在Set中自动被过滤:
var s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"}

注意数字3和字符串’3’是不同的元素。

  • 通过add(key)方法可以添加元素到Set中,可以重复添加,但不会有效果:
s.add(4);
s; // Set {1, 2, 3, 4}
s.add(4);
s; // 仍然是 Set {1, 2, 3, 4}
  • 通过delete(key)方法可以删除元素:
var s = new Set([1, 2, 3]);
s; // Set {1, 2, 3}
s.delete(3);
s; // Set {1, 2}
  • 小结

Map和Set是ES6标准新增的数据类型,请根据浏览器的支持情况决定是否要使用。

Iterable中的遍历

for … of替代for … in

  • 遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型

  • 具有iterable类型的集合可以通过新的for … of循环来遍历。

  • for … of循环是ES6引入的新的语法,请测试你的浏览器是否支持:

'use strict';
var a = [1, 2, 3];
for (var x of a) {
}
console.log('你的浏览器支持for ... of');
  • 用for … of循环遍历集合,用法如下:
var a = ['A', 'B', 'C'];
var s = new Set(['A', 'B', 'C']);
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
for (var x of a) { // 遍历Array
    console.log(x);
}
for (var x of s) { // 遍历Set
    console.log(x);
}
for (var x of m) { // 遍历Map
    console.log(x[0] + '=' + x[1]);
}
  • 你可能会有疑问,for … of循环和for … in循环有何区别?

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

  • 当我们手动给Array对象添加了额外的属性后,for … in循环将带来意想不到的意外效果:

var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
    console.log(x); // '0', '1', '2', 'name'
}
  • for … in循环将把name包括在内,但Array的length属性却不包括在内。

  • for … of循环则完全修复了这些问题,它只循环集合本身的元素:

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

这就是为什么要引入新的for … of循环。

forEach

然而,**更好的方式是直接使用iterable内置的forEach方法,它接收一个函数,每次迭代就自动回调该函数。**以Array为例:

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

输出:

A, index = 0
B, index = 1
C, index = 2
  • 注意,forEach()方法是ES5.1标准引入的,你需要测试浏览器是否支持。

  • Set与Array类似,但Set没有索引,因此回调函数的前两个参数都是元素本身:

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

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

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

如果对某些参数不感兴趣,由于JavaScript的函数调用不要求参数必须一致,因此可以忽略它们。例如,只需要获得Array的element:

var a = ['A', 'B', 'C'];
a.forEach(function (element) {
    console.log(element);
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"undefined is not iterable" 的意思是"未定义的变量不能被迭代"。通常出现在 JavaScript 编程语言,当你尝试对一个未定义的变量使用迭代器方法时会出现这个错误。 例如,如果你尝试对一个未定义的变量进行 for...of 循环,就会出现这个错误。这通常发生在变量没有被正确初始化或者在作用域之外使用时。 要解决这个问题,你需要确保变量已经被正确初始化或者在迭代之前进行必要的检查。可以使用 typeof 运算符检查变量是否已经定义,或者使用默认值来初始化变量,以确保它不会是 undefined。"undefined is not iterable" 的意思是“未定义的值不可迭代”。这通常意味着你在尝试迭代一个未定义或不存在的值,例如对一个未声明或赋值的变量使用 for...of 循环或其他需要迭代对象的操作。为了解决这个问题,你需要检查代码使用的变量是否已经定义或被正确赋值,或者使用条件语句或异常处理机制来避免出现这种错误。"undefined is not iterable" 的意思是 "未定义的值无法被迭代"。这通常发生在你尝试对一个未定义的变量进行循环操作时出现的错误。这个错误可以通过检查代码的变量定义和赋值来解决,确保它们被正确地定义和初始化。"undefined is not iterable" 的意思是 "未定义的变量无法被迭代"。这通常会在使用某个未定义的变量进行迭代操作时出现,因为未定义的变量并没有任何可迭代的属性或方法。要解决此问题,您需要确保在迭代之前,所有变量都被正确地定义和初始化。"undefined is not iterable" 的意思是未定义的值不可迭代。这通常出现在使用 for...of 循环、Array.from() 或类似方法时,当传入的值为 undefined 时就会报错。要解决这个问题,需要先判断传入的值是否为 undefined,如果是,就需要先将其赋予一个可迭代的值。"undefined is not iterable" 的意思是 "未定义的对象不可迭代"。这通常是由于在尝试使用未定义的变量作为可迭代对象时出现的错误。解决此问题的方法是确保要迭代的对象已被正确定义并已被分配值。"undefined is not iterable" 的意思是“未定义的变量不可迭代”。通常出现在使用迭代器(如for循环)遍历一个未定义的变量时。这意味着该变量不存在,因此不能进行迭代操作。要解决此问题,需要先定义该变量并确保其有可迭代的属性或值。"undefined is not iterable" 的意思是未定义的值不能迭代。通常在 JavaScript ,这个错误会在你试图使用一个未定义或空值的对象来执行一个循环操作时发生。这可能是因为你没有正确初始化这个对象或者代码存在其他错误导致该对象未被正确赋值。要解决这个错误,你需要确保对象已经被正确定义和初始化,或者在进行迭代操作之前添加必要的判断条件来避免未定义的情况。 抱歉,我不了解这个术语。"undefined is not iterable" 的意思是“未定义不能被迭代”。在 JavaScript ,当您尝试迭代一个未定义的值时,就会出现此错误。这通常表示您尝试在一个空的变量或未定义的变量上执行迭代操作。为了解决这个问题,您需要确保您的变量在使用前已被定义并且已经赋值了一个可以迭代的值。"undefined is not iterable" 的意思是“未定义的变量不可迭代”。 通常情况下,当您尝试对一个未定义的变量使用迭代器(例如 `for...of` 循环)时,JavaScript 就会报出这个错误。这是因为未定义的变量没有迭代器方法,因此无法进行迭代操作。 要解决这个问题,您可以检查变量是否已经被正确地声明和赋值。如果变量确实已经被定义了,那么您需要检查它的值是否具有可迭代性。例如,字符串、数组、SetMap 等都是可以被迭代的对象,而数字、布尔值、null 和 undefined 等则不行。 很抱歉,我不太明白您的意思。这个错误信息的意思是“未定义的对象不是可迭代的”。通常出现在你试图对一个未定义或者未初始化的对象进行迭代操作时。比如说,如果你写了这样的代码: ``` let arr; for (let item of arr) { console.log(item); } ``` 因为 `arr` 没有被定义或者初始化,所以会出现 `undefined is not iterable` 错误。解决这个问题的方法就是在使用对象之前先定义并且初始化它,确保它是一个可以被迭代的对象。"undefined is not iterable" 的意思是 "未定义不能迭代"。在编程,这个错误通常会在你尝试对一个未定义的值进行迭代操作时发生。解决方法通常是先检查该值是否已经被定义,如果未定义则需要先进行定义再进行迭代操作。 很抱歉,我无法理解您的问题。 很高兴认识你,很高兴能为你服务。这个错误信息是指一个变量被当作可迭代对象使用,但实际上它并不是一个可迭代对象。在编程,如果要使用循环或迭代器等功能,就需要使用可迭代对象。如果一个对象不支持迭代,就会出现类似于"undefined is not iterable"的错误提示。要解决这个问题,需要检查代码相应的变量是否确实是可迭代对象,并且确保正确地使用它们。这个错误信息通常出现在JavaScript,意思是“未定义的不可迭代对象”。在JavaScript,迭代器用于遍历数据结构,如数组、集合和映射。如果一个对象不是一个可迭代对象,那么它就不能被用于遍历操作。 通常出现这个错误的原因是,在代码使用了一个不是数组或类似数组的对象进行遍历操作。解决方法是检查代码涉及到的数据结构,确保它们是可迭代对象,或者使用其他适当的方法来访问它们的值。"undefined is not iterable" 的意思是“未定义不可迭代”。这通常出现在尝试对一个未定义的变量进行迭代操作时,比如使用for循环遍历一个未定义的数组或对象。这种情况下,JavaScript会抛出一个TypeError类型的异常,提示变量未定义且不能进行迭代操作。要解决这个问题,需要先确保变量已经被正确地定义和初始化,然后才能进行迭代操作。 很抱歉,我无法理解你说的话。这个错误信息通常表示您试图迭代一个未定义(undefined)的变量。在JavaScript,当您尝试对未定义的变量使用迭代方法时,就会出现此错误。要解决这个问题,您需要确保在迭代之前给变量赋值,并确保变量是一个可迭代对象,例如数组或字符串。这个错误信息是指在代码尝试迭代一个未定义(undefined)的变量,因为未定义的变量并不具有可迭代性(iterable)。通常情况下,这个错误可以通过在代码为变量赋值或者检查代码逻辑来解决。这个错误信息表示,您正在尝试迭代一个未定义(undefined)的对象,而无法对其进行迭代操作。这通常是因为您尝试对一个不是对象的数据类型进行迭代操作,例如 null 或者数字类型。解决此问题的方法通常是检查代码的数据类型,确保您正在对正确的数据类型进行迭代操作。"undefinedisnotiterable" 的意思是未定义不可迭代。这通常是在JavaScript出现的错误信息,它表示您尝试使用for...of循环迭代一个未定义的变量,而未定义的变量不是可迭代对象,因此无法进行迭代操作。要解决此错误,请确保您正在使用已定义的可迭代对象。这个错误信息表示你尝试对一个未定义(undefined)的变量进行迭代操作,而迭代操作只能用于可以被迭代的对象,比如数组或者字符串等。解决这个问题的方法是要先确保变量被正确地定义和初始化,然后再进行迭代操作。这个错误信息 "undefined is not iterable" 表示您尝试对一个未定义或未声明的变量执行迭代操作,例如使用 for 循环语句对其进行遍历。在这种情况下,您需要先确保该变量已被正确地定义或声明,然后再执行迭代操作。这个错误提示通常表示你尝试在一个非可迭代对象上进行迭代操作,比如说一个普通的数字或者一个空值。这个错误提示通常出现在使用for循环或者一些迭代函数时。要解决这个问题,你需要确认你的对象确实是可迭代的,比如一个列表、元组或者字典,或者你需要使用一个能够将你的对象转化为可迭代对象的函数。"undefined is not iterable" 的意思是 "undefined 不可迭代"。这个错误通常会在使用迭代器(如 for...of 循环)时出现,因为变量的值为 undefined,而 undefined 并不是一个可迭代的对象。要解决这个问题,需要先检查变量的值是否为 undefined,并在值为 undefined 时执行相应的处理,以避免程序出错。这个错误信息是在 JavaScript 出现的,意思是 undefined 不是一个可迭代的对象。通常情况下,这是因为你尝试对一个未定义的变量使用迭代器方法,例如 for...of 循环。 要解决这个问题,你需要先确保你要迭代的对象已经被正确地定义和初始化。你可以使用 typeof 运算符来检查变量是否已经被定义,以及 instanceof 运算符来检查对象是否可迭代。如果对象不可迭代,你需要对其进行转换,例如将其转换为数组或类数组对象。 另外,如果你正在使用第三方库或框架,这个错误信息可能是因为你传递了错误的参数或使用了错误的方法,所以你需要查看相关的文档或代码来找出问题所在。这个错误提示通常表示你尝试对一个未定义或非可迭代对象进行迭代操作。这可能是因为你使用了一个不存在的变量名或者该变量不是一个可迭代对象,比如一个数字或者一个 None 类型的变量。要解决这个问题,你需要确认该变量名是否正确,并且该变量是否确实是一个可迭代对象。这个错误提示通常表示你尝试使用一个非可迭代对象进行迭代操作。这种情况通常出现在以下场景: 1. 你使用了一个未定义或者未初始化的变量作为迭代对象。 2. 你尝试对一个函数或者其他不支持迭代的数据类型进行迭代操作。 3. 你使用了一个对象或者数组,但是这个对象或数组不存在或者为空。 要解决这个错误,你需要确认迭代对象的类型和内容是否正确。如果你使用了一个变量作为迭代对象,请确保该变量已经被定义和初始化。如果你使用了一个函数或者其他不支持迭代的数据类型,请确认你的代码逻辑是否正确。如果你使用了一个对象或者数组,请检查该对象或数组是否存在并且包含有效的元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值