Co to jest " x & & foo ()"?

Widziałem gdzieś else said,

x && foo();

Jest równe

if(x){
    foo();
}
Przetestowałem go i zrobili to samo.
Ale dlaczego? Czym dokładnie jest x && foo()?
Author: Community, 2011-08-07

5 answers

operatory AND and OR mogą używać skrótów.

Więc && próbuje drugiego wyrażenia tylko wtedy, gdy pierwsze jest prawdziwe(podobne do prawdy, dokładniej). Fakt, że druga operacja robi rzeczy (niezależnie od zawartości foo() robi) nie ma znaczenia, ponieważ nie jest wykonywana , chyba że to pierwsze wyrażenie ocenia na coś prawdziwego. Jeśli jest to prawdziwe, to zostanie wykonane w celu wypróbowania drugiego testu.

Odwrotnie, jeśli pierwsze wyrażenie w || stwierdzenie jest prawdziwe, drugi nie jest dotykany. Dzieje się tak, ponieważ cała instrukcja może być już oceniona, wynikiem będzie true niezależnie od wyniku drugiego wyrażenia, więc zostanie zignorowana i pozostanie nienazwana.

Przypadki, na które należy zwrócić uwagę przy użyciu skrótów takich jak ten, są oczywiście przypadkami z operatorami, w których zdefiniowane zmienne nadal oceniają wartości falsy (np. 0), i prawdziwymi (np. 'zero').

 64
Author: Kzqai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-02 13:37:47

Jest to znane jako Ocena zwarcia .

W tym przypadku, jeśli x jest fałszywa, to foo() nie musi być oceniana (wynik && zawsze będzie fałszywy); jeśli {[0] } Jest Prawdziwa, musi być oceniana (nawet jeśli wynik zostanie odrzucony).

 24
Author: Johnsyweb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-09 10:59:18

To nie jest dokładnie równoważne. Pierwsze z nich to wyrażenie z wartością zwracaną, której możesz użyć; drugie to polecenie.

Jeśli nie jesteś zainteresowany wartością zwracaną (tzn. informacją, czy zarówno x, jak i foo() oceniają wartość true), są one równoważne, ale zwykle powinieneś użyć wersji logiki logicznej tylko wtedy, gdy chcesz użyć jej jako wyrażenia logicznego, np.:

if (x && foo()) {
    do_stuff();
}

Jeśli jesteś zainteresowany tylko uruchomieniem foo() warunkowo (gdy X jest truthy), druga forma jest preferowana, ponieważ wyraźniej przekazuje intencję.

Powodem, dla którego ludzie mogą preferować wersję logiki logicznej, może być to, że javascript podlega nietypowemu ograniczeniu: rozmiar kodu źródłowego (bardziej szczegółowy kod źródłowy oznacza większą przepustowość); ponieważ wersja logiki logicznej używa mniej znaków, jest bardziej efektywna przepustowość. Ja i tak wolę bardziej wyrazistą wersję przez większość czasu, chyba że dany skrypt jest często używany - jak na bibliotekę podobnie jak jQuery, używanie takich optymalizacji jest doskonale uzasadnione, ale w większości innych przypadków tak nie jest.

 8
Author: tdammers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-07 12:14:49

W javascript, operator && ocenia od lewej do prawej i zwraca wartość operacji po prawej stronie. Jeśli pierwszy warunek zostanie oceniony na false, drugi nie zostanie oceniony. Więc to skrót od powiedzenia " jeśli coś nie jest null lub undefined, zrób coś "

 3
Author: Mrchief,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-07 02:35:33

To zwarcie.

Operator && działa w ten sposób: wykonuje logiczne or dwóch operandów po obu stronach. Jeśli lewa strona ma wartość niezerową, to prawa strona jest obliczana w celu określenia wartości prawdy. Jeśli lewa strona jest równa zero, to niezależnie od prawej strony, wyrażenie zostanie ocenione na 0, dlatego prawa strona jest oceniana , a nie. Tak więc w efekcie, jeśli x jest niezerowe, to wywołane jest tylko foo, a jeśli x jest 0, to foo nie jest wywoływana, a zatem działa jak if - else w tym przypadku.

 2
Author: phoxis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-07 02:39:08