Почему подобная подстрока возвращает "undefined" в JavaScript?
Я столкнулся с странным поведением при выполнении некоторых регулярных выражений в JavaScript сегодня (Firefox 3 в Windows Vista).
var str = "format_%A";
var format = /(?:^|\s)format_(.*?)(?:\s|$)/.exec(str);
console.log(format); // ["format_%A", "%A"]
console.log(format[0]); // "format_undefined"
console.log(format[1]); // Undefined
Нет ничего плохого в регулярном выражении. Как вы можете видеть, он соответствует правильной части в первом вызове console.log
.
Internet Explorer 7 и Chrome ведут себя так, как ожидалось: format[1]
возвращает "% A" (ну, Internet Explorer 7 делает что-то правильно, было немного неожиданно...)
Является ли это ошибкой в Firefox или какой-то "особенностью", о которой я не знаю?
Ответы
Ответ 1
Это потому, что console.log() работает как printf(). Первый аргумент console.log() на самом деле является строкой формата, за которой могут следовать дополнительные аргументы. % A является заполнителем. Например:
console.log("My name is %A", "John"); // My name is "John"
Подробнее см. документацию console.log(). % A и любые другие недокументированные заполнители, похоже, делают то же самое, что и% o.
Ответ 2
Кажется, что %A
как-то переводится в строку undefined
.
Попробуйте избежать части %A
, я думаю, что это решит проблему.