Может ли это объяснить это (используя версию узла 4.2.4)?Jayscript regex test weirdness
var n; //undefined
/^[a-z0-9]+$/.test(n); // true!
/^[a-f0-9]+$/.test(n); // false
Может ли это объяснить это (используя версию узла 4.2.4)?Jayscript regex test weirdness
var n; //undefined
/^[a-z0-9]+$/.test(n); // true!
/^[a-f0-9]+$/.test(n); // false
переменная передается .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
, который говорит:
- Пусть R - это объект RegExp.
- Пусть 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"
.
Возможно, это преобразование 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.
RegExp.test
рассматривает n
как строку "undefined"
.
Итак, диапазон [a-f]
не охватывает все символы строки undefined
.
В вашем случае «Mimimum допустимый» диапазон для прохождения проверки регулярных выражений будет [a-u]
var n; //undefined
console.log(/^[a-u]+$/.test(n)); // true
Что именно неясно? Что вы думаете или ожидаете, будет ли регулярное выражение пытаться совпадать? – Xufox
n преобразуется в строку, так как 'test()' ожидает строку, поэтому ее теперь '' undefined ''. '' undefined ''проходит первый тест, но не второй – Musa
. В одном регулярном выражении есть a-z, а у другого есть a-f, второй случай не будет выполнен, так как u не входит в диапазон a-f. –