Почему совпавшая подстрока возвращает "неопределенный" в 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 или какая-то "особенность", о которой я не знаю?
2 ответа
Это потому, что console.log () работает как printf (). Первый аргумент console.log () - это строка формата, за которой могут следовать дополнительные аргументы. %A является заполнителем. Например:
console.log("My name is %A", "John"); // My name is "John"
См. Console.log () документация для деталей. %A и любые другие недокументированные заполнители, кажется, делают то же самое, что и%o.
Похоже на %A
как-то переводится в строку undefined
,
Попробуйте убежать от %A
Часть, я думаю, что это решит проблему.