console.log() неправильно работает?
Клиентский console.log() не сильно отличается от серверного.
Иногда в логах можно получить неожиданные результаты:
console.log('%data%', []) NaNata%
Обратите внимание, мы передали два параметра в метод log(). Мы хотели вывести сначала строку, а потом массив. Но вместо вывода двух элементов мы получили одну странную строку на выходе.
Что тут произошло?
Разбираемся в проблеме с console.log()
Важно знать, что первый параметр в методе log() у объекта console может иметь свой собственный синтаксис написания. Это чем-то похоже на шаблон регулярного выражения, но только в качестве подстановки остальных параметров метода.
За особое поведение при записи строки в журнал на диск в файл играет такое понятие как «printf«. Это особая логика работы на уровне операционной системы. За основу объяснения я возьму Linux.
NodeJS печатает на стандартный вывод (stdout) с новой строкой. Можно передать несколько аргументов, причем первый используется как основное сообщение, а все дополнительные используются как значения подстановки, аналогичные printf(3) (все аргументы передаются в util.format()).
Если упростить объяснение, то важно помнить следующее. Если первый параметр в методе log() является строкой с символом процента внутри, то надо быть внимательным в остальных параметрах метода.
Если после символа процента стоит латинская буква «s» — «%s«, то такое выражение будет заменено на Строку (строковый тип данных String).
console.log('%s', []) console.log('%s', [1]) 1 console.log('%s', [1,2]) 1,2
Внимание! Выражение «console.log(‘%s‘, [])» сначала пытается привести массив к строке, а затем подставить эту строку в шаблон. В результате такой подстановки мы получаем «пустую строку».
Приведение массива равносильно выражению:
[].toString() ''
Если после символа процента стоит латинская буква «d» — «%d«, то такое выражение будет заменено на Число (числовой тип данных Number).
console.log('%d', []) NaN console.log('%d', [1]) 1 console.log('%d', [1,2]) 1
В случае привидения массива к числу, получаются неожиданные результаты. Именно такой неожиданный результат мы получили в самом начале этой публикации.
Остальные примеры читайте в документации к «util.format()«.