Це згідно спец.
12.5 Заява if
.....
2. Якщо вірно ToBoolean (GetValue (exprRef)), то
а. Поверніть результат оцінки першої заяви.
3. Ще,
….
Відповідно до специфікації, ToBoolean є
Абстрактна операція ToBoolean перетворює свій аргумент у значення типу Boolean згідно таблиці 11:
І ця таблиця говорить про рядки:
Результат помилковий, якщо аргументом є порожній рядок (його довжина дорівнює нулю); інакше результат правдивий
Тепер, щоб пояснити, чому "0" == false
ви повинні прочитати оператор рівності, який стверджує, що він отримує своє значення, якщо абстрактна операція GetValue(lref)
відповідає однаковій для правої частини.
Що описує цю відповідну частину як:
якщо IsPropertyReference (V), то
а. Якщо HasPrimitiveBase (V) помилковий, то нехай get є внутрішнім методом бази [[Get]], інакше нехай отримує
бути спеціальним внутрішнім методом [[Get]], визначеним нижче.
б. Поверніть результат виклику внутрішнього методу get, використовуючи base як його це значення, і передаючи
GetReferencedName (V) для аргументу
Або іншими словами, рядок має примітивну базу, яка викликає внутрішній метод отримання і виявляється помилковою.
Якщо ви хочете оцінити речі за допомогою операції GetValue ==
, якщо ви хочете оцінити за допомогою функції ToBoolean
, використовуйте ===
(також відомий як "суворий" оператор рівності)
"0"
є рядком, і оскільки він не порожній, він оцінюється як істинний.