Это ошибка в Ecmascript - /\S/.test(null) возвращает true? - PullRequest
5 голосов
/ 12 марта 2010

Как в Actionscript3, так и в Javascript эти операторы дают одинаковый результат:

/\S/.test(null) => true  
/null/.test(null) => true  
/m/.test(null) => false  
/n/.test(null) => true  

Похоже, что в этом случае значение NULL преобразуется в строку "NULL".

Это известная ошибка в Ecmascript или я что-то упустил?

Ответы [ 2 ]

11 голосов
/ 12 марта 2010

Это не ошибка, но вы правы, null принудительно к 'null', и это поведение определено в спецификации:

  1. RegExp.prototype.test(string), внутренне эквивалентно выражению: RegExp.prototype.exec(string) != null
  2. Тип метода exec преобразует первый аргумент в строку, используя внутреннюю операцию ToString (см. Шаг 1 метода exec).
  3. Внутренняя операция ToString явно возвращает "null", когда вход имеет тип Null.

В заключение, в ваших примерах RegExp сопоставляется со строкой 'null', поэтому первый непробельный символ, в данном случае буква 'n'.

var a = null+''; // 'null'
/\S/.test(a); // true
(null+'').match(/\S/) // ["n"]
3 голосов
/ 12 марта 2010

null является объектом , и при тестировании с объектами (не в виде строки) сначала он преобразуется в строку, а затем выдает этот результат.

Вы можете попробовать с /Number/.test(Number) или /String/.test(String), что также вернет true.

Вероятно, String(null) вызывается, то есть 'null'

String(Number) даст

function Number() {
    [native code]
}

и /function Number/.test(Number) возврат true тоже

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...