小问题,求大神解答!!!!

题目:A为首,F结尾截取数组

    var list1 = ['A', 'B', 'C', 'D', 'F', 'A', 'B', 'C', 'E', 'D', 'F', 'A', 'B', 'D', 'F', 'A', 'C', 'B', 'D', 'F', 'A', 'C', 'D', 'F', 'A', 'C', 'E', 'D', 'F']

    var list2 = []

    var arr = []
    for (var i of list1) {
        if (i == 'A') {
            arr = []
        }
        else if (i == 'F') {
            list2.push(arr)
            // arr此时不包含F
        }
                     // 添加F   但是为什么会改变list2里面的arr呢?
            arr.push(i)
    }

    console.log(list2)



疑惑: else if (i == 'F') {
            list2.push(arr)
                            // arr此时不包含F
        }
    这个时候的arr是不包含的F的,已经push到了list2,为什么结果集却包含了F?   下面的arr.push(i)  理应不会改变list2里面的数组,带着疑问我又做了测试

        var list1 = ['A', 'B']
    var arr=[]
    list1.forEach(val=>{
        arr.push(val)
    })
    list1.push('G')
    console.log(list1);//arr里面并未加入G,为什么上面的F会在原数组改变的时候又加进去呢?

只是先后顺序问题,打个比方,书包里面放文具盒,文具盒里面放铅笔,下面两种结果有什么不同:

先把铅笔放进文具盒,再把文具盒放进书包;
先把文具盒放进书包,在把铅笔放进文具盒;

arr.push(i)没有放到else里,所以F也push进去了,其实A也应该在里边吧。

要改成这样:


if (i == 'A') {
            arr = []
        }
        else if (i == 'F') {
            list2.push(arr.slice(0)) //趁现在还没有F的时候,考一份新的出来。
        }
                //else //如果没有else,会继续执行下一行,因为这行不在判断语句范围内。
            arr.push(i)

通俗的来说,变量名就像是标签,屋子有很多个箱子。
你手上有A、B两个标签。
现在你把A贴在甲箱子上,然后又把B标签贴在A标签上(这就是引用--B引用A)。那么A、B标签所标注的都是甲箱子里的东西。
只要箱子里的东西改变了,A、B标注的内容也改变了。
这与你先改变箱子里的东西,再贴B标签到A上,
还是和原先一样,先把B标签贴在A上,再改变箱子里的东西。
没有半毛钱关系。

你的第一个例子
list2标签贴在乙箱上
arr标签贴在甲箱上
如果"A"来了,就把标签贴到一个新的空箱子上,比如丙箱,然后把"A"装进丙箱。
"B"、"C"、"D"来了,就原箱子继续装
如果"F"来了,就把原箱先装进乙箱,然后把"F"装进原箱。
所以乙箱里每一份,都有且必须有A和F。

你第二个例子
list1标签贴在甲箱子
arr标签贴在乙箱子上
你先往乙箱子里东西
然后再往甲箱子里装东西
它们是互不相关的