– Как ты это делаешь?Только что убил пол-дня на простую ошибку. Причём смотрел на нужную строку, смотрел не раз… А у меня в длиннннющем прайс-листе такая чехарда из-за этого была…
– Всё правой, всё правой…
Если кратко: в JS непустая строка не равна нулю, а в PHP — равна.
<?php
$sTest = "Is this Habrastring equal to zero in PHP? ";
echo( ($sTest == 0) ? "Yep." : "Nope." );
?>
в PHP вернёт Yep.
var sTest = "Is this Habrastring equal to zero in JS? ";
alert ( (sTest == 0) ? "Yep." : "Nope." );
в JS вернёт Nope.
Может, есть ещё похожие простые грабли, о которых стоит знать заранее?
Комментарии (30)
helg1978
12.03.2019 05:52Перестаньте сравнивать строки с числами, и тогда станет не важно, что, в каком языке, вернет if
NeoCode
12.03.2019 07:29Если кратко: и JS и PHP — языки с динамической слабой типизацией. В этом корень всего зла.
vintage
12.03.2019 07:34+1Оказывается в разных языках разные правила приведения типов. Вот это поворот!
Sirion
12.03.2019 09:12Хорошее название. Надо, чтобы кто-нибудь написал к нему хорошую статью. А вот это закопайте.
Naves
12.03.2019 09:17А что мешает всегда использовать strlen? И в условии сравнения всегда понятно, что происходит без разбивания контекста, что в переменной оказывается не число, а строка.
DeniSun
12.03.2019 09:28Я, может, чего не понял, но зачем строку сравнивать с числом?
Каков смысл данной проверки?
«пустоту» строки определяет кол-во символов в ней.
tuxi
12.03.2019 09:40Грабли раскиданы повсюду. Много лет назад, я убил 6 часов на попытки понять, почему в фтп клиенте я вижу список файлов, а мое приложение их упорно не видит. Ситуация осложнялась еще тем, что библиотека от апача тогда еще была сырой и в ней хватало других глюков. Вот эти файлы с расширением .1c я надолго запомнил.
de1vin
12.03.2019 09:45В дайджесте недавно было на эту тему
wiki.php.net/rfc/string_to_number_comparison
вообще в здоровом коде все же лучше явное с явным сравнивать.
echo ((int)$sTest === 0) ? "Yep." : "Nope."
AlexLeonov
12.03.2019 09:49Мануал по языку, на котором пишете, читайте ДО нажатия кнопки «Опубликовать» на хабре, тогда и удивленных «открытий» у вас будет поменьше.
geoolekom
По какой вообще логике непустая строка равна нулю в PHP? Безумие. Она же непустая.
Barabas79
Просто при сравнении в примере автора строка приводиться к числу, но тут строка не является строковым выражением числа, поэтому как число она равна тут нулю.
Если бы строка была например «123» то было бы значение 123.
mSnus Автор
Но, например, 5zzzz != 0, a zzzz5 == 0
Warrangie
Есть правила приведения типов.
Строка проводится к int двумя способами:
Если вы хотели спросить про приведение типов, или бы это сделать на stackoverflow или на худой конец на тостере, если вам там не хочется читать спецификации.