文章目录
- 1. 概述
- 2. 数组 - Array
- for
- forEach
- for...of...
- for...in
- ES6 - keys()
- ES6 - values()
- ES6 - entries()
- 3. 对象 - Object
- for...in...
- Object.keys(obj)
- Object.getOwnPropertyNames(obj)
- Object.getOwnPropertySymbols(obj)
- Reflect.ownKeys(obj)
- 4. 集合 - Set
- Set.prototype.keys()
- Set.prototype.values()
- Set.prototype.entries()
- forEach()
- 5. 映射 - Map
- Map.prototype.keys()
- Map.prototype.values()
- Map.prototype.entries()
- forEach()
- 6 总结
- 6.1 break 和 Continue 问题
- 6.2 使用推荐
1. 概述
JavaScript中使用的最频繁的数据结构无非就是 Array和Object,在日常的工作当中遍历它们是非常频繁的。在ES6中新增了Set和Map数据结构,遍历方式也大同小异。
在实际的工作中,后台程序读取数据库获取列表数据,返回给前端之后,前端要进行渲染展示,比如商品列表数据:
- 多个商品列表,通过数组接收,数组每一个元素都是商品对象。
- 商品的名称、属性、上下架状态、是否打折等就是商品对象的各个属性。
2. 数组 - Array
数组是值的有序集合,数组中的每个值称为一个元素,每个元素在数组中都有一个数字位置,称为索引,索引从 0 开始,依次递增。在 JavaScript 中,您可以使用 Array 对象定义数组,此外,Array 对象中还提供了各种有关数组的属性和方法。
for
遍历的次数由数组的长度决定。
let cars = ["Benz", "BMW", "Lexus"];
// 方式1:for
for (let i = 0; i < cars.length; i++) {
console.log(`for遍历下:第 ${i} 的值: ${cars[i]}`)
}
forEach
let cars = ["Benz", "BMW", "Lexus"];
// 方式2:forEach
cars.forEach(function (value, index) {
console.log(`forEach遍历下:第 ${index} 的值: ${value}`)
});
for…of…
let cars = ["Benz", "BMW", "Lexus"];
// 方式3:for...of...
for (let car of cars) {
console.log(`for...of遍历下: ${car}`)
}
for…in
let cars = ["Benz", "BMW", "Lexus"];
// 方式4:for...in
for (let index in cars) {
console.log(`for...in遍历下: ${cars[index]}`)
}
ES6 - keys()
let cars = ["Benz", "BMW", "Lexus"];
// 方式5:ES6 - keys()
for (let index of cars.keys()) {
console.log(`ES6 - keys 遍历下:第 ${index} 的值: ${cars[index]}`)
}
ES6 - values()
// 方式6:ES6 - values()
for (let car of cars.values()) {
console.log(`ES6 - values 遍历下:${car}`)
}
ES6 - entries()
let cars = ["Benz", "BMW", "Lexus"];
// 方式7:ES6 - entries()
for (let [index, car] of cars.entries()) {
console.log(`ES6 - keys 遍历下:第 ${index} 的值: ${car}`)
}
3. 对象 - Object
JavaScript 是一种面向对象的编程语言,在 JavaScript 中几乎所有的东西都是对象。因此,要想有效的使用 JavaScript,首先需要了解对象的工作原理以及如何创建并使用对象。
我们可以将对象看作是一个属性的无序集合,每个属性都有一个名称和值(键/值对)。通过《JS数据类型》一节我们知道,数组是值的集合,每个值都有一个数字索引(从零开始,依次递增)。对象类似与数组,不同的是对象中的索引是自定义的,例如 name(姓名)、age(年龄)、gender(性别)等。
for…in…
const benzCarObj = {
"brand": "Benz",
"name": "Benz E300L",
"price": 550000
}
// 方式1: for...in...
for (let attr in benzCarObj) {
console.log(`for...in遍历下的汽车: ${attr}=> ${benzCarObj[attr]}`)
}
Object.keys(obj)
const benzCarObj = {
"brand": "Benz",
"name": "Benz E300L",
"price": 550000
};
// 方式2: Object.keys(obj)
Object.keys(benzCarObj).forEach(function (attr) {
console.log(`Object.keys()遍历下的汽车: ${attr}=> ${benzCarObj[attr]}`)
});
Object.getOwnPropertyNames(obj)
const benzCarObj = {
"brand": "Benz",
"name": "Benz E300L",
"price": 550000
};
// 方式3: Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames(benzCarObj).forEach(function (attr) {
console.log(`Object.getOwnPropertyNames()遍历下的汽车: ${attr}=> ${benzCarObj[attr]}`)
});
Object.getOwnPropertySymbols(obj)
// 方式4: Object.getOwnPropertySymbols(obj)
let brand = Symbol('brand');
let name = Symbol('name');
let price = Symbol('price');
let bmwCarObj = {
[brand]: "BMW",
[name]: "BMW 530Li",
[price]: 489800
};
let bmwCarObjSymbols = Object.getOwnPropertySymbols(bmwCarObj);
console.log(bmwCarObjSymbols);
Reflect.ownKeys(obj)
const benzCarObj = {
"brand": "Benz",
"name": "Benz E300L",
"price": 550000
};
// 方式5: Reflect.ownKeys(obj)
Reflect.ownKeys(benzCarObj).forEach(function (attr) {
console.log(`Reflect.ownKeys()遍历下的汽车: ${attr}=> ${benzCarObj[attr]}`)
});
4. 集合 - Set
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。Set本身是一个构造函数,用来生成 Set 数据结构。
Set.prototype.keys()
let carSet = new Set(["Benz", "BMW", "Lexus"]);
// 方式1:Set.prototype.keys()
for (let car of carSet.keys()) {
console.log(`Set.prototype.keys()遍历下的集合元素: ${car}`)
}
Set.prototype.values()
let carSet = new Set(["Benz", "BMW", "Lexus"]);
// 方式2:Set.prototype.values()
for (let car of carSet.values()) {
console.log(`Set.prototype.values()遍历下的集合元素: ${car}`)
}
Set.prototype.entries()
let carSet = new Set(["Benz", "BMW", "Lexus"]);
// 方式3:Set.prototype.entries()
for (let [index, car] of carSet.entries()) {
console.log(`Set.prototype.entries()遍历下的集合元素: ${index} => ${car}`)
}
forEach()
let carSet = new Set(["Benz", "BMW", "Lexus"]);
// 方式4:forEach()
carSet.forEach((index, car) => {
console.log(`forEach()遍历下的集合元素:${index} => ${car}`)
});
5. 映射 - Map
Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。
Map.prototype.keys()
const carMap = new Map([
['name', 'BMW 530Li'],
['price', 498520],
]);
// 方式1:Map.prototype.keys()
for (let attr of carMap.keys()) {
console.log(`Map.prototype.keys()遍历下的集合元素: ${attr}`)
}
Map.prototype.values()
const carMap = new Map([
['name', 'BMW 530Li'],
['price', 498520],
]);
// 方式2:Map.prototype.values()
for (let attr of carMap.values()) {
console.log(`Map.prototype.values()遍历下的集合元素: ${attr}`)
}
Map.prototype.entries()
const carMap = new Map([
['name', 'BMW 530Li'],
['price', 498520],
]);
// 方式3:Map.prototype.entries()
for (let [attr, value] of carMap.entries()) {
console.log(`Map.prototype.entries()遍历下的集合元素: ${attr} => ${attr}`)
}
forEach()
const carMap = new Map([
['name', 'BMW 530Li'],
['price', 498520],
]);
// 方式4:forEach()
carMap.forEach((index, car) => {
console.log(`forEach()遍历下的集合元素:${index} => ${car}`)
});
6 总结
6.1 break 和 Continue 问题
- 在 forEach、map、filter、reduce、every、some 函数中 break 和 continue 关键词都会不生效,因为是在function中,但function解决了闭包陷阱的问题。
- 要使用 break、continue 可以使用 for、for…in、for…of、while。
6.2 使用推荐
- 遍历数组:for(),forEach(),map(),for…of 。
- 遍历对象:for…in…