Ответ 1
PHP преобразует обе стороны в booleans, когда на одной стороне есть null.
В разделе руководства PHP на "Операторы сопоставления" указано, что если тип операнда 1 "bool или null" или наоборот, он "преобразует обе стороны в bool, FALSE < TRUE
".
Любое число с ненулевым значением считается правдивым, хотя это может быть неинтуитивным.
В JavaScript сравнение определяется по-разному, поэтому они сравниваются численно (null
→ 0).
ECMA-262, официальная спецификация JavaScript, гласит, что:
3. Если это не так, что оба типа (px) - это String, а Type (py) - String, то
а. Пусть nx - результат вызова ToNumber (px). Поскольку px и py являются примитивными значениями, порядок оценки не важен.
б. Пусть ny является результатом вызова ToNumber (py).
Известно, что PHP имеет довольно противоречивую систему принуждения типов - PHP: фрактал плохого дизайна освещает еще несколько проблем, с которыми сталкивается PHP. (Смею, я говорю, я лично считаю, что это хуже, чем JavaScript, язык, также известный под принудительными типами принуждения.)