为什么无法全部遍历打印

为什么无法全部遍历打印

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
 
<body>
    <script>
        const obj = {
            "0": "xm",
            "sex": "male",
            length: 2
        }
        // 在此补充代码
        obj[Symbol.iterator]=Array.prototype[Symbol.iterator];
        for(const i of obj){
            console.log(i)
        }
        
    </script>
</body>
 
</html>

问题描述:

为什么无法全部遍历打印,问题在哪?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,遍历的是有索引的,例如数组:

https://img1.sycdn.imooc.com//climg/63de036c096fbca406620163.jpg

而对象中的属性名为数字的只有第一个0,所以只输出xm;不是数字的,会返回undefined值,并且length不会输出。

建议参考课程中的写法:

https://img1.sycdn.imooc.com//climg/63de0405094d51bc08160715.jpg

修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
const obj = {
            "0""xm",
            "sex""male",
            length: 2
        };
        // 在此补充代码
        // obj[Symbol.iterator] = Array.prototype[Symbol.iterator];
        obj[Symbol.iterator] = () => {
 
            let index = 0;
 
            return {
 
                next() {
 
                    index++;
 
                    if (index === 1) {
 
                        return {
 
                            value: obj["0"],
 
                            done: false,
 
                        };
 
                    else if (index === 2) {
 
                        return {
 
                            value: obj["sex"],
 
                            done: false,
 
                        };
 
                    else if (index === 3) {
 
                        return {
 
                            value: obj["length"],
 
                        };
 
                    else {
 
                        return {
 
                            done: true,
 
                        };
 
                    }
 
                },
 
            };
 
        };
        for (const i of obj) {
            console.log(i);
        }

祝学习愉快!

  • GanKuoLong 提问者 #1

    看了代码我有两个问题

    1. 为什么函数没有()执行也能运行函数语句并返回值?

    2. 对象内为什么可以放index++跟if判断语句,不是说对象内只能放键与值对吗?

    2023-02-04 15:30:50
  • 好帮手慕星星 回复 提问者 GanKuoLong #2

    1、es6中的for...of循环,Iterator 接口主要供for...of消费。文档:

    https://es6.ruanyifeng.com/#docs/iterator

    https://img1.sycdn.imooc.com//climg/63de1b5c09dd00b206520336.jpg

    可以理解为next()方法是for...of遍历的时候内部自动调用的,不需要我们手动调用。

    2、next是方法不是对象,所以可以定义变量以及判断等语句

    https://img1.sycdn.imooc.com//climg/63de1da20980fafc06140377.jpg

    自己理解下。

    2023-02-04 16:56:19
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码