Javascript array.forEach Scope?

时间:2015-01-12 07:34:12

标签: javascript arrays foreach scope

第9行的console.log显示

{'count':1111111,'average':2222222,'total':3333333}

对于所有3个数组元素,即使进行这些更改的循环尚未运行。这怎么可能?

function test11(){

    var test = [
        { 'count' : 1 , 'average' : 2 , 'total' : 3 } ,
        { 'count' : 10 , 'average' : 20 , 'total' : 30 } , 
        { 'count' : 100 , 'average' : 200 , 'total' : 300 }
    ] ; 

    console.log( test ) ; 

    test.forEach( function( element , service_index , array ){

        array[ service_index ].count = 1111111 ;
        array[ service_index ].average = 2222222 ;
        array[ service_index ].total = 3333333 ;

    });

    console.log( test ) ;

    return ; 

}

这是代码http://jsfiddle.net/d46wh2cv/7/的jsfiddle。

我在以下网址阅读了规格:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

但我没有看到这种反直觉行为的任何解释。

我使用Google Chrome 39.0.2171.95运行Debian Linux,并且在Iceweasel 24.5.0中也有相同的结果。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您正在记录对象的引用(因为Arrays是全局Array对象的实例)。

你是对的,循环在日志行时没有运行,但这没关系。 当你检查它时,值已经改变了(因为循环可能需要2或3毫秒才能运行)。

尝试仅记录test[0].count而不是整个对象。