В этом году, до пандемии, я работал над личным проектом, используя недавно изученный фреймворк Angular. Теперь основным средством отладки, которое рекомендуется использовать всем, является функция print или console.log()<. /strong>, с помощью которого мы можем проверять состояние переменных и наблюдать за ходом выполнения нашей программы или кода.

По сути, я обновлял массив динамически.

Теперь обратите внимание на этот фрагмент кода, приведенный ниже:

1: A = [1,2]; 
2: console.log(A); 
3: A[0] = 5; 
4: console.log(A)

Каким должен быть выход?

[1, 2]
[5, 2]

Правильно? Но консоль Google Chrome выводит:

[5, 2]
[5, 2]

Теперь вам интересно, как изменился массив до того, как он наткнулся на третью строку? Оператор console.log() определенно над ним?

Затем я копался в Интернете, пока не наткнулся на это сокровище на StackOverflow: https://stackoverflow.com/questions/11284663/console-log-shows-the-changed-value-of-a-variable-before- значение-на самом деле-ch/

Помните указатели и ссылки на языке C из уроков программирования?

Оказывается, когда вы кодируете console.log(A), вы фактически передаете указатель или ссылку на объект >(здесь массив). Кроме того, Javascript реализует парадигму программирования, называемую «ленивое вычисление», что означает, что он не вычисляет выражение, пока в этом не возникнет необходимость.

Итак, вы передаете указатель в console.log(), и он оценивается только тогда, когда вы нажимаете на него, но к тому времени массив изменился! Следовательно, он оценивает лениво и дает окончательный массив.

Временные решения?

Так как же нам записать фактическое состояние объекта/массива? Существуют различные решения:

console.log([…A]) // using the spread operator for array A
console.log(A.toString()) // convert the array to a string "[5, 2]"
console.log(json.stringify(A))

Это был чертовски интересный баг. Спасибо, что прочитали мою историю! До встречи в следующий раз!

Ссылки: Комикс XKCD: https://xkcd.com/979/

Этот пост является частью серии блогов Клуба программирования IIT Kanpur.

Все изображения, используемые здесь, являются моими собственными изображениями или общедоступными изображениями в Интернете.