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()
? 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'
).
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).
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.
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ś "
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.
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