2016-08-01 2 views
0

Может ли это объяснить это (используя версию узла 4.2.4)?Jayscript regex test weirdness

var n; //undefined 
/^[a-z0-9]+$/.test(n); // true! 
/^[a-f0-9]+$/.test(n); // false 
+0

Что именно неясно? Что вы думаете или ожидаете, будет ли регулярное выражение пытаться совпадать? – Xufox

+1

n преобразуется в строку, так как 'test()' ожидает строку, поэтому ее теперь '' undefined ''. '' undefined ''проходит первый тест, но не второй – Musa

+0

. В одном регулярном выражении есть a-z, а у другого есть a-f, второй случай не будет выполнен, так как u не входит в диапазон a-f. –

ответ

1

переменная передается .test() сначала преобразуется в строку. Это указано в спецификации:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.10.6.3

, который указывает на:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.10.6.2

, который говорит:

  1. Пусть R - это объект RegExp.
  2. Пусть S - значение ToString (строка).

Так в основном вы тестируете:

/^[a-z0-9]+$/.test("undefined"); // true! 
/^[a-f0-9]+$/.test("undefined"); // false 

Теперь должно быть понятно, почему второй тест возвращает false. Буквы u, n и i не включены в тестовый образец.


Примечание: Функция ToString() в спецификации относится к функции типа принуждения в базовой реализации (вероятнее всего, C или C++, хотя существуют и другие реализации Дж.С. на других языках, как Java и Go). Он не относится к глобальной функции toString() в js. Таким образом, эта вторая строка в спецификации в основном означает, что undefined будет рассматриваться как "" + undefined, который возвращает "undefined".

1

Возможно, это преобразование undefined в строку. Итак:

var pattern1 = /^[a-z0-9]+$/ 
var pattern2 = /^[a-f0-9]+$/ 
pattern1.test("undefined") // There are only letters 
pattern2.test("undefined") // defed match, but unin does not. 
0

RegExp.test рассматривает n как строку "undefined".
Итак, диапазон [a-f] не охватывает все символы строки undefined.
В вашем случае «Mimimum допустимый» диапазон для прохождения проверки регулярных выражений будет [a-u]

var n; //undefined 
console.log(/^[a-u]+$/.test(n)); // true