2014-11-24 1 views
2

Я уже видел несколько вопросов, объясняющих, почему 0 == "" является true в JavaScript, но у меня есть немного более глубокий вопрос.Как JavaScript (0 == "") === true согласен с правилами преобразования типа ECMA-262?

Таким образом, ответ почему 0 == "" в JavaScript true является то, что строка "" преобразуется в число, строка нулевой длины преобразуется в нулевое число, но, как это согласуется с [9.3.1 paragraph of ECMA-262](http://www.ecma-international.org/ecma-262/5.1/#sec-9.3.1), который говорит, что строка должна быть проанализирован с использованием данной формальной грамматики, и если это не удается, то такая строка преобразуется в NaN. Когда я посмотрел эту спецификацию, я подумал, что "" не является строковым числовым литералом, и он должен быть проанализирован как NaN и NaN не равен 0.0.

Итак, почему выше спекуляций неверно и 0 == "" на самом деле true?

Заранее спасибо.

+0

* MV of StringNumericLiteral ::: [empty] is 0. * –

+0

О, спасибо. Мне нужно быть внимательнее. :) – yaromir

ответ

3

Грамматика позволяет СтроковойЧисленныйЛитерал быть пустым:

СтроковойЧисленныйЛитерал :::
        СтрПробелов неавтоматического
        СтрПробелов неавтоматическогоСтрЧисленныйЛитералСтрПробелов неавтоматического

несколько строк вниз, он говорит:

СтроковойЧисленныйЛитерал что пуст или содержит только пустое пространство преобразован в +0.

и:

МЗ СтроковойЧисленныйЛитерал ::: [пусто] равно 0.

Так что я боюсь, что вы просто не полностью прочитать стандартный проход вы смотрите. :)

+0

Как и «Некоторые различия должны быть отмечены между синтаксисом StringNumericLiteral и NumericLiteral (см. 7.8.3): ... StringNumericLiteral, который пуст или содержит только пробел, преобразуется в +0." –

+0

@JonSkeet: Ta –

+0

Интересно, почему они беспокоились о двух постановках в главной записи _StringNumericLiteral_. Они могли бы просто добавить _opt_ после _StrNumericLiteral_. – Barmar