•  

    Strona 197 rozdzial 7 - autorzy użyli double banga. Hipstersko. Ale problematycznie. Nie wyjaśniono co to. Ponadto nie jestem fanem tego zapisu:

    Let x = !!y

    Co to oznacza? Jaka byla intencją programisty? Ryzyko wielu bledow #angular

    •  

      @tomi_12: ale co castuje? wiesz co castuje z tego zapisu? czego spodziewasz sie pod y?

    •  

      no przecież tego nie ma, ogólnie mi chodziło o to, że cokolwiek by było w y to zostanie zrzutowane na booleana, czyli np. jak y = 1 to x === true, jak y = 0 to x === false, itd.

    •  

      @tomi_12: tak. No właście w tym problem, że y nie ma. I nie wiadomo co tam będzie. Działanie !! nie jest oczywiste i ma wyjątki. Gdy go używasz nie wiadomo jakie y-ki akceptujesz w kodzie, oraz co tak naprawdę chcesz zrobić używając !! biorąc pod uwagę, że różne y-ki mogą przyjść.

    •  

      @tomaszs: podaj przykład kiedy po operacji !! nie dostaniemy booleana? pomijając oczywiście not defined error

    •  

      @tomi_12: ale mi nie chodzi o to co dostajesz na wyjsciu, ale o to, co mozesz dostac na wejscie

    •  

      @tomi_12: ten artykuł ma zebrane wszystkie plusy i minusy. Jak dla mnie stosowanie double bang ma więcej minusów https://www.sitepoint.com/javascript-double-negation-trick-trouble/

      M.in. dlatego:

      return ! !window; //Returns true
      return ! !null; //Returns false
      return ! !undefined; //Returns false
      return ! !false; //Returns false
      return ! !true; //Returns true
      return ! !""; //Returns false
      return ! !"Hi"; //Returns true
      return ! !0; //Returns false
      return ! !1; //Returns true

      Double bang przyjmie wszystko. Zawsze dostaniesz true albo false. Ale jeśli nie masz odpowiednio zabezpieczonego kodu, to użycie double bang powoduje, że mały problem zastępujesz większym problemem. Błędna wartość rozwiąże Ci się do true albo false, i kod idzie dalej przyjmując złe założenie.

      Przykład:

      dostajesz na wejście zmienną x. Spodziewasz się, że jest to boolean. Ale to jest JavaScript. To jest życie. To jest ulica. Dostajesz 1. Twój kod powinien wykryć, że coś jest nie tak:

      let x = 1;
      if (! !x) {
      console.log('Double bang mówi: true')
      } else if (!x) {
      console.log('Double bang mówi: false')
      } else {
      console.log('Double bang mówi: coś jest nie tak')
      }

      if (x === true) {
      console.log('Triple equals mówi: true')
      } else if (x === false) {
      console.log('Triple equals mówi: false')
      } else {
      console.log('Triple equals mówi: coś jest nie tak')
      }

      Stosując double bang kontynuujesz pisać dalej negację !x. Ale double bang nie wykryje, że coś jest nie tak. Bo ! !x zwraca true. Zanim napiszesz, że Ci się to nie przytrafi doczytaj do końca:

      Oczywiście można tłumaczyć, że uważny programista nie popełni takiego błędu jak w przykładzie. Ale to jest kwestia nawyków, przyzwyczajeń. Stosując Double bang mówisz: nie obchodzi mnie co przyjdzie na wejście, interesuje mnie tylko by dostać booleana. W efekcie tego założenia (świadomego lub nie) Twój kod nie wykryje błędnej wartości. Całe dalsze wykonywanie kodu będzie skażone.

      Z kolei, gdy stosujesz triple equals (porównanie wartości i typu (w skrócie)) dostajesz info, że coś jest nie tak.

      Gdy stosujesz triple equals jawnie musisz określić co chcesz dostać na wejście i przetworzyć dane wejściowe na booleana. Także porównanie zawsze jest precyzyjne.

      I każdy kto pisze ten kod i używa go, jest świadom, co spodziewasz się na wejściu.

      Dlatego uważam, że Double bang nie jest dobrą praktyką

      Ps. Musiałem dać spacje między ! i !, bo inaczej wykop psuł