Почему совпадающая подстрока возвращает "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, или какая-то" особенность " I не знаете о чем?

2 5

2 ответа:

Это потому, что консоль.log() работает как printf (). Первый аргумент для утешения.log () - это фактически строка формата, за которой могут следовать дополнительные аргументы. %A-это заполнитель. Например:

console.log("My name is %A", "John"); // My name is "John"

См. консоль.log () documentation для получения подробной информации. %A и любые другие недокументированные заполнители, по-видимому, делают то же самое, что и %o.

Похоже, что %A каким-то образом переводится в строку undefined.

Попробуйте избежать части %A, я думаю, что это решит проблему.