老师这些代码不懂啊
来源:2-9 原生可遍历和非原生可遍历
球球不一般
2022-01-03 19:50:27
3.非原生可遍历的有哪些
// 一般的对象
const person = { sex: 'male', age: 18 };
// console.log(person[Symbol.iterator]());
// {next()} {value,done}
// person[Symbol.iterator] = () => {
// let index = 0;
// return {
// next() {
// index++;
// if (index === 1) {
// return {
// value: person.age,
// done: false
// };
// } else if (index === 2) {
// return {
// value: person.sex,
// done: false
// };
// } else {
// return {
// done: true
// };
// }
// }
// };
// };
// for (const item of person) {
// console.log(item);
// }
// for in
// 有 length 和索引属性的对象
const obj = {
'0': 'alex',
'1': 'male',
length: 2
};
obj[Symbol.iterator] = Array.prototype[Symbol.iterator];
// obj[Symbol.iterator] = () => {
// let index = 0;
// return {
// next() {
// let value, done;
// if (index < obj.length) {
// value = obj[index];
// done = false;
// } else {
// value = undefined;
// done = true;
// }
// index++;
// return {
// value,
// done
// };
// }
// };
// };
for (const item of obj) {
console.log(item);
}
搜索
复制
1回答
好帮手慕然然
2022-01-04
同学你好,解答如下:
这段代码主要是讲解,如何遍历非原生可遍历对象(即不具有Symbol.iterator方法的对象),非原生可遍历对象不能直接使用for...of来遍历。所以,如果想要使用for...of来遍历的话,那么就要手动给其添加Symbol.iterator方法。
像person[Symbol.iterator] = () =>{}、obj[Symbol.iterator] = () => {} 这两段代码,是在给person对象以及obj对象添加Symbol.iterator方法。
其中,person一个是普通的对象,即 {sex: 'male',age: 18}。obj是一个带有 length 和索引属性的对象,即 {'0': 'alex','1': 'male',length: 2}。
对于普通对象来说,只能根据对象属性的个数,通过判断index值一步步来操作,比较麻烦。
而对于带有 length 和索引属性的对象来说,可以利用length属性(即对象属性的个数)和索引属性(即index值)来完成操作,不再需要一步步来判断。
而且对于带有 length 和索引属性的对象,还有一种更简单的添加Symbol.iterator方法的方式,即 obj[Symbol.iterator] = Array.prototype[Symbol.iterator]。
关于这段代码,建议同学能够大概了解其作用以及流程即可,不需要掌握,实际工作中基本用不到。
祝学习愉快!
相似问题