Почему JavaScript RegExp/^\w + $/соответствует undefined?

Почему RegExp /^\w+$/ соответствует undefined?

Пример кода:

alert(/^\w+$/.test(undefined));

Это будет отображаться в Firefox 3 (только браузер, в котором я тестировал его).

Ответы

Ответ 1

Когда undefined передается в строку (которая выполняется в регулярном выражении), она создает строку "undefined", которая затем сопоставляется.

Ответ 2

/(\w)(\w)(\w)(\w)(\w)/.exec(undefined);  

возвращает: ["undef", "u", "n", "d", "e", "f"]

Он обрабатывает undefined как строку "undefined".

Ответ 3

См. раздел 15.10.6.2 спецификации ECMAScript для RegExp.prototype.exec(строка), который вызывается из метода .match. match в основном является exec, когда он оценивается как true.

Вот слово в слово из спецификации: Выполняет сопоставление регулярных выражений строки с регулярным выражением и возвращает объект Array, содержащий результаты совпадения, или null, если строка не соответствует Строка ToString (string) выполняется для поиска регулярного выражения следующим образом:

  • Пусть S - значение ToString (string).
  • Пусть длина - длина S.
  • Пусть lastIndex - значение свойства lastIndex.
  • Пусть я - значение ToInteger (lastIndex).
  • Если глобальное свойство является ложным, пусть я = 0.
  • Если я < 0 или I > length, то установите lastIndex равным 0 и верните null.
  • Вызовите [[Match]], предоставив ему аргументы S и i. Если [[Match]] возвратил ошибку, перейдите к шагу 8; в противном случае r будет его результатом состояния и перейдите к шагу 10.
  • Пусть я = я + 1.
  • Перейдите к шагу 6. ​​
  • Пусть значение e равно значению endIndex.

Как вы можете видеть, он преобразует любой ввод в строку, поэтому undefined становится "undefined", и это будет соответствовать true.

Протестировано это также вне браузера, используя JScript в командной строке и получив тот же результат.