范围如何影响JavaScript中的变量声明?

时间:2017-06-28 00:17:12

标签: javascript

问题:

为什么obj变量的声明必须转移到" //移动到这里"下面的位置正确生成{number:1,color:blue}和{number:2,color:red}对象的数组?当声明停留在下面的当前位置时,数组会产生{number:2,color:red},{number:2,color:red}(即同一个对象,两次)

我的理解:

在当前位置,arrObj数组使用最新的obj值更新,因此输出是一个两次列出的数组"数字:2,颜色:红色"。

混乱:

当obj声明移动到// MOVE TO HERE下面时,两个对象怎么出现在数组中?如果每次更新obj动态更新数组,为什么arrObj [0]没有被清除,然后在第二次声明obj时用obj的新值更新?

     function arrayOfObjects(array) {
            var arrObj = [];
            var obj = {};

            for (i = 0; i < array.length; i++) {
              //MOVE TO HERE
                for (j = 0; j < array[i].length; j++) {
                    obj[array[i][j][0]] = array[i][j][1];
                }
                arrObj[i] = obj;
            }
            return arrObj;
        }

var array = [ [ ['number', '1'], ['color', 'blue'] ] , ['number', '2'], ['color', 'red'] ] ]
arrayOfObjects(array);

1 个答案:

答案 0 :(得分:-1)

在JavaScript中,可以通过引用传递对象。在这种情况下,这意味着arrObj和obj引用内存中的同一对象。 因此,当在第二次迭代中,obj已经被变异{number:12,color:red} arrObj [0]和arrObj [1]都引用了同一个对象。 SO discussion