Według ECMA-262, strony 11.13 następuje to wyczerpująca lista związków operatorów przypisania: *= /= %= += -= <<= >>= >>>= &= ^= |=
.
Zgodnie z częścią 11.11, var c = a || b
wprowadzi a
wartość do c
jeżeli ToBoolean(a)
jest prawdą i wprowadzi b
wartość do c
inaczej. Jako taki, logiczny OR jest często używany jako operator koalescencji, np
function (options) {
options = options || {};
}
Często wystarczy, COALESCE służy do określenia wartości domyślnej zmiennej, jak wykazano powyżej: a = a || b
.
Wydaje się, że związek operator przypisania ||=
byłaby bardzo przydatna, umożliwiając napisać powyższy kod w krótszym i czystszego sposób: a ||= b
. Jednakże, nie ma (chociaż *=
, +=
a operatorami przypisania czynnych wynoszą).
Pytanie brzmi: dlaczego?
javascript
language-design
history
penartur
źródło
źródło
+=
,*=
,-=
,/=
, dlaczego nie%=
działa?).angle %= 360
LubvertexIndex %= numberOfVertices
(dla listy wierzchołków zamkniętego wielokąta).||=
i&&=
już wkrótce: „Być może z przyjemnością dowiesz się, że do JS2 / ES4 dodawane są również || = i && =. || = jest najbardziej przydatne z tych dwóch, ale nie ma powodu, aby pozostawić formę && przydziału ”. .Odpowiedzi:
Jedną z możliwych przyczyn jest to, że operatory logiczne
&&
i||
ma zachowanie „zwarcie”. Argument po prawej stronie&&
i||
nie jest oceniany, chyba że jest to konieczne. Być może z tego powodu projektanci języków zdecydowali, że znaczenie takiego wyrażeniaa ||= f()
nie jest oczywiste, dlatego lepiej pominąć takie operatory.źródło
a ||= b
należy to interpretować jakoa = a || b
, ale tak naprawdę może byća || a = b
(jak w Ruby ). Mogą się różnić, jeśli seter ma efekt uboczny. Wybór jednego może być zły dla użytkowników w drugim obozie. Osobiście podoba mi się tena || a = b
sposób (sposób Rubinowy), ale nie jestem pewien, czy wszyscy są z tego zadowoleni.Ogólna odpowiedź na wszystkie pytania dotyczące „dlaczego ta funkcja języka nie została zaimplementowana” jest taka, że zespół, który zaprojektował ten język, uznał, że korzyść nie przewyższa kosztów.
Koszt może przybierać różne formy. Wdrożenie funkcji językowej wymaga czasu i wysiłku, ale wiąże się to również z wewnętrznym kosztem złożoności: czy funkcja sprawia, że język jest bardziej złożony lub niejednoznaczny, nieproporcjonalny do jego potencjalnych korzyści?
||=
Operator hipotetyczny robi coś zasadniczo odmiennego od innych operatorów przypisań złożonych. Podczas gdy inne operatory mają charakter czysto matematyczny, ten jest inny: zastępuje jedną wartość inną (w opisanym kontekście).Biorąc pod uwagę tę dwuznaczność (operator wykonuje dwie różne funkcje, w zależności od kontekstu), nietrudno zrozumieć, dlaczego nie został uwzględniony w języku. Chociaż twierdzisz, że to się zmienia
do
wykonanie koalescencji zerowej jest cenną cechą, korzyść jest dla mnie o wiele mniej oczywista. Jeśli ma nastąpić podstawienie wartości, logiczne (i wyraźniejsze) wydaje się posiadanie obu wartości po prawej stronie znaku równości, aby zapewnić wizualne wskazanie, że taka zamiana może wystąpić.
C # obrał inną ścieżkę i używa określonego operatora do koalescencji zerowej.
źródło
foo = foo || bar
wymagafoo
dwukrotnego wpisania . Jest to zarówno uciążliwe, jak i podatne na refaktoryzację literówek.||=
jako zerowego operatora koalescencyjnego nie jest intuicyjne i w rzeczywistości wygląda tępo w formie kodu. Przydaje się, gdy próbujesz wykonać matematykę boolowską.function fulfill(inValue) { if(resolved || rejected) return false; /* Do stuff here */ return true; } resolved ||= fulfill(value)
Masz rację,
||=
to jest przydatna konstrukcja. Istnieje w Perlu.W rzeczywistości Perl udostępnia wszystkie te elementy :
Niektóre z nich są świetne (
.=
dodaje coś na końcu łańcucha), inne mniej (&&=
??? Przypuszczam, że zmienna zostałaby ustawiona po prawej stronie, jeśli zarówno ona, jak i zmienna są prawdziwe. Ale dlaczego miałbyś to robić? ?)To, co jest zawarte w języku, jest tak naprawdę cechą jego filozofii projektowania.
źródło
&&=
oznacza / robi.