– Как ты это делаешь?
– Всё правой, всё правой…
Только что убил пол-дня на простую ошибку. Причём смотрел на нужную строку, смотрел не раз… А у меня в длиннннющем прайс-листе такая чехарда из-за этого была…

Если кратко: в 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)


  1. geoolekom
    12.03.2019 02:01

    По какой вообще логике непустая строка равна нулю в PHP? Безумие. Она же непустая.


    1. Barabas79
      12.03.2019 02:14
      +1

      Просто при сравнении в примере автора строка приводиться к числу, но тут строка не является строковым выражением числа, поэтому как число она равна тут нулю.
      Если бы строка была например «123» то было бы значение 123.


      1. mSnus Автор
        12.03.2019 03:33
        -1

        Но, например, 5zzzz != 0, a zzzz5 == 0


        1. Warrangie
          12.03.2019 07:35
          +1

          Есть правила приведения типов.
          Строка проводится к int двумя способами:


          1. "1гашуди" == 1: true, "2394fjdish38" == 2394: true;
          2. "Dududh220" == 0: true, "eiegej" == 0: true;
            Если вы хотели спросить про приведение типов, или бы это сделать на stackoverflow или на худой конец на тостере, если вам там не хочется читать спецификации.


  1. Huan
    12.03.2019 02:09
    +1

    === — вам в помощь


    1. mSnus Автор
      12.03.2019 03:40
      -2

      В данном случае — наоборот, я нашел, где в коде была цифра "ноль" и заменил её на строку "0". Строгая типизация просто помогла бы выловить эту ошибку быстрее, но все равно спасибо)


      1. crmMaster
        12.03.2019 09:24

        > я нашел, где в коде была цифра «ноль» и заменил её на строку «0»

        Пробил себе голову фейспалмом от таких решений. Huan все правильно сказал. Вам нужна пустая строка — сравнивайте с пустой строкой по типу.


  1. Pydeg
    12.03.2019 02:18
    +2

    Как можно писать на языке с динамической типизацией, не зная про приведение типов в нем? Тренируете интуицию?


    1. mSnus Автор
      12.03.2019 03:03
      -3

      Это был не мой код, legacy. Там и не такое встречалось :) но это показалось особо коварным поведением


  1. Smayliks
    12.03.2019 02:47

    Кто сильнее — кит или слон?


  1. index0h
    12.03.2019 02:52
    +1

    На что люди только не идут, что бы не использовать типизированные сравнения


    1. Dair_Targ
      12.03.2019 03:52

      На что люди только не идут, что бы сравнивать что угодно с чем угодно:)


  1. qbz
    12.03.2019 05:00
    +9

    Хабр превратился в твиттер рандомных джуниоров? "Статья" из серии "о, смотрите, я узнал как правильно вкручивать лампочку". Немного не соответствует уровню ресурса, не кажется?


    1. AleXP3
      12.03.2019 05:06

      Тут давно уже так.


  1. helg1978
    12.03.2019 05:52

    Перестаньте сравнивать строки с числами, и тогда станет не важно, что, в каком языке, вернет if


  1. NeoCode
    12.03.2019 07:29

    Если кратко: и JS и PHP — языки с динамической слабой типизацией. В этом корень всего зла.


  1. vintage
    12.03.2019 07:34
    +1

    Оказывается в разных языках разные правила приведения типов. Вот это поворот!


  1. gearbox
    12.03.2019 08:23
    +3

    О сколько нам открытий чудных
    Готовят просвещенья дух
    И опыт, сын ошибок трудных,
    И гений, парадоксов друг,
    И случай, бог изобретатель…


    1. tuxi
      12.03.2019 09:46

      И коллега, кривой рукой вносящий…


  1. Eldhenn
    12.03.2019 08:44

    А что, в пыхе не принято на такое ругаться? В Perl было принято.


  1. Matisumi
    12.03.2019 08:55
    +1

    А где ложные друзья-то?


  1. Sirion
    12.03.2019 09:12

    Хорошее название. Надо, чтобы кто-нибудь написал к нему хорошую статью. А вот это закопайте.


  1. Naves
    12.03.2019 09:17

    А что мешает всегда использовать strlen? И в условии сравнения всегда понятно, что происходит без разбивания контекста, что в переменной оказывается не число, а строка.


  1. Jogger
    12.03.2019 09:18

    Обколються своей динамической типизацией…
    /sarcasm


  1. DeniSun
    12.03.2019 09:28

    Я, может, чего не понял, но зачем строку сравнивать с числом?
    Каков смысл данной проверки?
    «пустоту» строки определяет кол-во символов в ней.


  1. tuxi
    12.03.2019 09:40

    Грабли раскиданы повсюду. Много лет назад, я убил 6 часов на попытки понять, почему в фтп клиенте я вижу список файлов, а мое приложение их упорно не видит. Ситуация осложнялась еще тем, что библиотека от апача тогда еще была сырой и в ней хватало других глюков. Вот эти файлы с расширением .1c я надолго запомнил.


  1. de1vin
    12.03.2019 09:45

    В дайджесте недавно было на эту тему
    wiki.php.net/rfc/string_to_number_comparison

    вообще в здоровом коде все же лучше явное с явным сравнивать.

    echo ((int)$sTest === 0) ? "Yep." : "Nope." 


  1. AlexLeonov
    12.03.2019 09:49

    Мануал по языку, на котором пишете, читайте ДО нажатия кнопки «Опубликовать» на хабре, тогда и удивленных «открытий» у вас будет поменьше.


  1. caine
    12.03.2019 09:54

    Зачем вообще сравнивать строку с числом?


    1. mSnus Автор
      12.03.2019 11:26

      Строки читаются из Экселя. А число было захардкожено предыдущим разработчиком.