NodeJS | console.log и процент в первом строковом параметре

NodeJS | console.log и процент в первом строковом параметре

console.log() неправильно работает?

Клиентский console.log() не сильно отличается от серверного.

Иногда в логах можно получить неожиданные результаты:

console.log('%data%', [])
NaNata%

Обратите внимание, мы передали два параметра в метод log(). Мы хотели вывести сначала строку, а потом массив. Но вместо вывода двух элементов мы получили одну странную строку на выходе.

Что тут произошло?

console.log() сломался на символе процента в JavaScript
console.log() сломался на символе процента в JavaScript

 

Разбираемся в проблеме с 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() с шаблоном подстановки строки и приведением массива к строке
console.log() с шаблоном подстановки строки и приведением массива к строке

Внимание! Выражение «console.log(‘%s‘, [])» сначала пытается привести массив к строке, а затем подставить эту строку в шаблон. В результате такой подстановки мы получаем «пустую строку».

Приведение массива равносильно выражению:

[].toString()
''
Привели пустой массив к строке и получили пустую строку в JavaScript
Привели пустой массив к строке и получили пустую строку в JavaScript

 

Если после символа процента стоит латинская буква «d» — «%d«, то такое выражение будет заменено на Число (числовой тип данных Number).

console.log('%d', [])
NaN
console.log('%d', [1])
1
console.log('%d', [1,2])
1

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

console.log() с шаблоном подстановки строки и приведением массива к числу
console.log() с шаблоном подстановки строки и приведением массива к числу

Остальные примеры читайте в документации к «util.format()«.