Очень странное поведение в Javascript. Код выходит из строя

#javascript

#javascript

Вопрос:

Мне трудно описать это, поскольку я не могу воссоздать какие-либо изолированные экземпляры. Установка логического значения внутри оператора if устанавливается до того, как оно когда-либо достигнет оператора if . Я думал, что это связано с тем, что на консоли журнал отображается не по порядку, но теперь я вижу результат в цикле j for при возникновении, если я не удалю notesObj.trans.all.combined[i].played = true .

 if(shapesNotes.length === 2){
    if(shapesNotes[1].trans.all.combined.length == 2){
        console.log("troubled value = "   shapesNotes[1].trans.all.combined[1].played)
    }

}

function setTranspositionsForAllNotes(notesObj,debugIndex){

    for(var i=0; i<notesObj.trans.all.combined.length;   i){
        var transNoteAt = notesObj.trans.all.combined[i].noteAt
        var transPlayed = notesObj.trans.all.combined[i].played
        
        console.log("debugIndex = "   debugIndex   "   i = "   i)
        console.log("notesObj.trans.all.combined.length = "  notesObj.trans.all.combined.length)
        console.log("notesObj.trans.all.combined[" i "].played = "   notesObj.trans.all.combined[i].played)
        console.log("shapesNotes[" debugIndex "].trans.all.combined[" i "].played = "   shapesNotes[debugIndex].trans.all.combined[i].played)

        console.log("noteAt = "    noteAt   " transNoteAt = "    transNoteAt)

        if(transPlayed === false amp;amp; 
           noteAt >= transNoteAt){
           
           var transInterval = notesObj.trans.all.combined[i].interval

           for(var j=0; j<notesObj.trans.array.length;   j){
             notesObj.trans.array[j]  = transInterval
             notesObj.trans.freqsPlusTrans[j] = getFrequencyPlusTranspositionForFreqIndex(notesObj,j)
           }
           
           console.log("transInterval = "   transInterval   " for "   debugIndex   "   i = "   i)
          

           notesObj.trans.all.combined[i].played = true
           
        
        }
    
    }
        
}

var debugIndex = 0;
shapesNotes.forEach(function(shapeNotes) {
    setTranspositionsForAllNotes(shapeNotes,debugIndex)
            
    debugIndex =1
});
  

Просто чтобы включить то, что показывает мой журнал, вот оно:

 1980 troubled value = false
1981 debugIndex = 0   i = 0
1982 notesObj.trans.all.combined.length = 2
1983 notesObj.trans.all.combined[0].played = false
1984 shapesNotes[0].trans.all.combined[0].played = false
1986 noteAt = 0.008333333333333333 transNoteAt = 0
1998 transInterval = 0 for 0   i = 0
1981 debugIndex = 0   i = 1
1982 notesObj.trans.all.combined.length = 2
1983 notesObj.trans.all.combined[1].played = false
1984 shapesNotes[0].trans.all.combined[1].played = false
1986 noteAt = 0.008333333333333333 transNoteAt = 0
1998 transInterval = 2 for 0   i = 1
1981 debugIndex = 1   i = 0
1982 notesObj.trans.all.combined.length = 2
1983 notesObj.trans.all.combined[0].played = false
1984 shapesNotes[1].trans.all.combined[0].played = false
1986 noteAt = 0.008333333333333333 transNoteAt = 0
1998 transInterval = 0 for 1   i = 0
1981 debugIndex = 1   i = 1
1982 notesObj.trans.all.combined.length = 2
1983 notesObj.trans.all.combined[1].played = true
1984 shapesNotes[1].trans.all.combined[1].played = true
1986 noteAt = 0.008333333333333333 transNoteAt = 0
  

Обратите внимание, что для моего «проблемного значения» установлено значение false для shapeNotes[1] для combined[1] в соответствии с журналом, но когда оно достигает этого значения в моем первом цикле for, оно сразу же каким-то образом устанавливается в true, и цикл j for внутри или журнал консоли никогда не отображаются. Как ни странно, логическая настройка notesObj.trans.all.combined[i].played = true внутри transPlayed === false amp;amp; noteAt >= transNoteAt условия выполняется немедленно, и в то же время ни один другой код внутри этого условия не выполняется, даже если я установил точку останова.

Комментарии:

1. Возможно ли, что две записи в массиве ссылаются на один и тот же объект, для свойства played которого вы уже установили значение true?

2. Для меня это звучит правдоподобно — naming ( all.combined ) предполагает, что они могут быть одной и той же ссылкой на объект.

3. Возвращает ли это значение true? shapesNotes[0].trans.all.combined[1] === shapesNotes[1].trans.all.combined[1]

4. просто в качестве теста: используйте точки с запятой в конце каждой строки / функции / блока кода (по назначению). Мне любопытно посмотреть, изменит ли это что-нибудь. * конечно: сохраните копию раньше…

5. Объекты внутри массивов являются одной и той же ссылкой — concat вернет новые ссылки на массив, хотя

Ответ №1:

Возможно, вам следует изменить i на i

Комментарии:

1. Это интересное предложение, но, к сожалению, это не имеет никакого эффекта.