• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czemu zmiana else if na samo if w tym przypadku zmienia działanie mojego kodu

Object Storage Arubacloud
+2 głosów
218 wizyt
pytanie zadane 13 marca w JavaScript przez Piotrek2713 Mądrala (5,380 p.)

Robię w js taką funkcję, która sprawdza, czy podana liczba jest dodatnia, ujemna, czy równa zero.

const response = document.querySelector('#response');

function chceckNumber(x)
{
    if (typeof x !== "Number")
    {
        response.textContent = 'Podana wartość jest nieprawidłowa. Wpisz dowolną liczbę';
    }
    if (x == "")
    {
        response.textContent = 'Nie podano liczby';
    }
    else if (x > 0)
    {
        response.textContent = 'Podana liczba jest dodatnia';
    }
    else if (x < 0)
    {
        response.textContent = 'Podana liczba jest ujemna';
    }
    else if (x == 0)
    {
        response.textContent = 'Podana liczba jest równa zero';
    }
}

window.addEventListener('keydown', (event) => {
    if (event.key === "Enter")
    {
        const inputValue = document.querySelector('#number').value;
        chceckNumber(inputValue);
    }
})

Podany wyżej kod działa prawidłowo, ale gdy zmienię warunek

if (x == "")
    {
        response.textContent = 'Nie podano liczby';
    }

na

else if (x == "")
    {
        response.textContent = 'Nie podano liczby';
    }

co w efekcie daje taki kod

const response = document.querySelector('#response');

function chceckNumber(x)
{
    if (typeof x !== "Number")
    {
        response.textContent = 'Podana wartość jest nieprawidłowa. Wpisz dowolną liczbę';
    }
    else if (x == "")
    {
        response.textContent = 'Nie podano liczby';
    }
    else if (x > 0)
    {
        response.textContent = 'Podana liczba jest dodatnia';
    }
    else if (x < 0)
    {
        response.textContent = 'Podana liczba jest ujemna';
    }
    else if (x == 0)
    {
        response.textContent = 'Podana liczba jest równa zero';
    }
}

window.addEventListener('keydown', (event) => {
    if (event.key === "Enter")
    {
        const inputValue = document.querySelector('#number').value;
        chceckNumber(inputValue);
    }
})

sprawia, że bez względu na wartość w polu tekstowym wyświetla się odpowiedź, że podana wartość jest nieprawidłowa.

Czy ktoś wie dlaczego tak się dzieje? Jestem bardzo ciekwawy, czemu to tak działa

4
komentarz 13 marca przez Wiciorny Ekspert (270,190 p.)
ja przypomnę tylko, że nagrywałeś "chcąc uczyć innych", odcinki dotyczące JavaScript np. a potem chyba nawet node.js

Przyczym raz, że tutaj trywialny jest błąd, są to jako tako podstawy, dwa, możesz przecież samemu prześledzić i debugować czym jest "x"
komentarz 14 marca przez Panelinio Gaduła (4,440 p.)
Wiciorny jak zawsze na posterunku B)

3 odpowiedzi

+3 głosów
odpowiedź 13 marca przez overcq Pasjonat (21,710 p.)

typeof x jest równe "string".

+1 głos
odpowiedź 13 marca przez Ehlert Ekspert (212,670 p.)
  1. Najzwyklejszy console-log-debugging rozwiązuje ten problem.
  2. Nie używaj ==
  3. W wersji pierwszej po wykonaniu bloku if dalej sprawdzasz i wykonujesz kolejne bloki if. 
  4. Typescript rozwiązuje takie problemy.
1
komentarz 13 marca przez Comandeer Guru (601,590 p.)
W jaki sposób TS rozwiązuje takie problemy?
komentarz 13 marca przez Ehlert Ekspert (212,670 p.)
Jak typujesz po number to raczej nie sprawdzasz w ciele funkcji czy typeof się zgadza i czy zmienna nie jest pustym stringiem.
1
komentarz 13 marca przez Comandeer Guru (601,590 p.)
Ale tutaj typowanie po number nie ma sensu, bo ta funkcja zawsze dostanie string ;) Co więcej: string pochodzący od usera, więc nie masz pojęcia, co tak naprawdę dostajesz. TypeScript absolutnie nic nie pomoże w walidacji danych w runtime.
komentarz 13 marca przez Ehlert Ekspert (212,670 p.)

Co więcej: string pochodzący od usera, więc nie masz pojęcia, co tak naprawdę dostajesz. TypeScript absolutnie nic nie pomoże w walidacji danych w runtime.

Gdyby ten argument był zasady, to podważałby całą sensowność typowania w tsie. Jeśli ktoś nie pilnuje swojej walidacji to zgoda, typy nie pomogą. Swoją drogą pisanie w jsie bez znajomości API z którego się korzysta tak właśnie się kończy - wszystko może być wszystkim. I tutaj TS może już pomóc.

1
komentarz 13 marca przez Comandeer Guru (601,590 p.)

Gdyby ten argument był zasady, to podważałby całą sensowność typowania w tsie.

Ale co ma typowanie w build time do walidacji w runtime? To są dwie zupełnie osobne kwestie. Można sobie otypować dane w API… ale potem trzeba i tak zrobić walidację, bo nie wiesz, co Ci przyjdzie.

Swoją drogą pisanie w jsie bez znajomości API z którego się korzysta tak właśnie się kończy - wszystko może być wszystkim. 

Tego też nie rozumiem w kontekście tego kodu. Wartość pola tekstowego zawsze jest stringiem. 

komentarz 13 marca przez Ehlert Ekspert (212,670 p.)

Robię w js taką funkcję, która sprawdza, czy podana liczba jest dodatnia, ujemna, czy równa zero.

Dalej uważasz że funkcja powinna dostawać string jako argument? Gdyby napisał to w tsie typując po number od razu poleciałby błąd.

Ale co ma typowanie w build time do walidacji w runtime?

No dość dużo, bo jak sam słusznie zauważyłeś nie ma sensu typować bez walidacji.

1
komentarz 13 marca przez Comandeer Guru (601,590 p.)

Dalej uważasz że funkcja powinna dostawać string jako argument? Gdyby napisał to w tsie typując po number od razu poleciałby błąd.

Dla mnie to jest funkcja walidująca dane przekazane od usera. Od usera dostaję stringa, więc przekazałbym tam stringa. Można rzutować na liczbę przed przekazaniem do funkcji, ale równie dobrze można to zrobić wewnątrz. W sensie serio nie widzę jakiejś wielkiej zalety z wykorzystania TS-a tutaj.

0 głosów
odpowiedź 13 marca przez VBService Ekspert (253,340 p.)
edycja 13 marca przez VBService

document.querySelector(...).value zwraca zawsze typ string*, więc zawsze się wykona pierwszy blok (IMO w tym przypadku lepiej jest użyć isNaN)

    if (typeof x !== "Number")
    {
        response.textContent = 'Podana wartość jest nieprawidłowa. Wpisz dowolną liczbę';
    }

 


 

W pierwszym przypadku są zawsze wykonywane pierwsze if-y, czyli blok A i B.

w drugim przypadku mamy tylko jeden blok if-ów, pierwszy, który zwróci wartość true przerywa dalsze wykonywanie bloku if-ów, czyli w tym przypadku jeżeli x nie jest liczbą, true zwraca pierwszy if (przerwanie sprawdzania kolejnych if-ów), drugi if w przypadku gdy x jest liczbą nigdy się nie wykona bo jakakolwiek liczba nie jest równa pustemu łańcuchowi znaków ( "" ).

 

*

<input id="text" value="0"><!-- domyślnie type="text" -->
<input type="number" id="number" value="0">
<pre id="response"></pre>

<script>
  window.addEventListener('keydown', (event) => {
    if (event.key === 'Enter')
    {
      document.querySelector('#response').textContent = 
        typeof document.querySelector('#text').value;

      document.querySelector('#response').textContent += '\n';

      document.querySelector('#response').textContent +=
        typeof document.querySelector('#number').value;    
    }
  }) 
</script>

 

 

BTW,

spróbuj zapisać tak blok warunków, według jednej z zasad tu opisanych: 5 Tips to Write Better Conditionals in JavaScript

const response = document.querySelector('#response');

function chceckNumber(x)
{
  if (isNaN(x)) {
    response.textContent = 'Podana wartość jest nieprawidłowa. Wpisz dowolną liczbę';
    return;
  }  
  if (x == "")  {
    response.textContent = 'Nie podano liczby';
    return;
  }

  response.textContent = 'Podana liczba jest ' + 
    ((x > 0) ? 'dodatnia': (x < 0) ? 'ujemna' : 'równa zero');
}

window.addEventListener('keydown', (event) => {
  if (event.key === 'Enter')
  {
    const inputValue = document.querySelector('#number').value.trim();
    chceckNumber(inputValue);
  }
})

 

Difference Between =, ==, and === in JavaScript ]

Podobne pytania

0 głosów
7 odpowiedzi 2,003 wizyt
pytanie zadane 23 stycznia 2018 w JavaScript przez ildan91 Użytkownik (630 p.)
0 głosów
1 odpowiedź 500 wizyt
pytanie zadane 13 lutego 2020 w C i C++ przez kasialke Nowicjusz (230 p.)
0 głosów
2 odpowiedzi 336 wizyt
pytanie zadane 22 sierpnia 2022 w C i C++ przez Daaa22 Dyskutant (8,250 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...