В этом году, до пандемии, я работал над личным проектом, используя недавно изученный фреймворк 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.
Все изображения, используемые здесь, являются моими собственными изображениями или общедоступными изображениями в Интернете.