2014-11-24 55 views
2

我已經看到幾個問題,解釋爲什麼0 == ""trueJavaScript,但我有一個更深的問題。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。當我看到這個規範時,我認爲""不是字符串數字文字,它應該被解析爲NaNNaN不等於0.0

那麼爲什麼以上的猜測是不正確的,0 == ""實際上是true

在此先感謝。

+0

* StringNumericLiteral ::: [空]的MV是0. * – 2014-11-24 16:40:01

+0

哦,謝謝。我需要更加細心。 :) – yaromir 2014-11-24 16:44:09

回答

3

語法允許StringNumericLiteral是空的:

StringNumericLiteral :::
        StrWhiteSpace選擇
        StrWhiteSpace選擇StrNumericLiteralStrWhiteSpace選擇

幾行了,它說:

一個StringNumericLiteral是空的或僅包含空白是轉換爲+0

和:

的MV StringNumericLiteral ::: [空]爲0

那麼恐怕你根本就沒有充分閱讀標準通道你在看。 :)

+0

以及「在StringNumericLiteral和NumericLiteral的語法之間應該注意一些差異(見7.8.3):... 空的或僅包含空格的StringNumericLiteral轉換爲+0。」 – 2014-11-24 16:41:48

+0

@JonSkeet:Ta – 2014-11-24 16:44:37

+0

我想知道他們爲什麼對主_StringNumericLiteral_條目中的兩個作品感到困擾。他們可以在_StrNumericLiteral_之後添加_opt_。 – Barmar 2014-11-24 16:45:42