В соответствии с ECMA-262, частью 11.13, Ниже приводится исчерпывающий перечень составных операторов присваивания: *= /= %= += -= <<= >>= >>>= &= ^= |=
.
В соответствии с частью 11.11, значение var c = a || b
будет помещено в a
значение true, c
если ToBoolean(a)
оно истинно, а b
значение в c
другое значение . Как таковой, логическое ИЛИ часто используется как оператор объединения, например
function (options) {
options = options || {};
}
Достаточно часто, COALESCE используется для задания значения по умолчанию для переменной, как было показано выше: a = a || b
.
Представляется , что составной оператор присваивания ||=
будет очень полезно, что позволяет писать код , указанный выше в более короткие и более чистой моды: a ||= b
. Тем не менее, это не существует (хотя *=
, +=
и другие операторы присваивания соединения).
Вопрос в том, почему?
источник
+=
,*=
,-=
,/=
, почему бы не%=
работать?).angle %= 360
илиvertexIndex %= numberOfVertices
(для списка вершин замкнутого многоугольника).||=
и&&=
скоро будет: «Возможно, вы будете рады узнать, что для JS2 / ES4 также добавляются || = и && =. полезный из двух, но нет никаких причин оставлять опциональную форму && вне. " ,Ответы:
Одной из возможных причин является то, что логические операторы
&&
и||
имеют «короткое замыкание» поведения. Правый операнд&&
и||
не оценивается без необходимости. Возможно, по этой причине разработчики языка решили, что значение выражения likea ||= f()
не было очевидным, и поэтому такие операторы лучше не учитывать.источник
a ||= b
следует интерпретировать какa = a || b
, но на самом деле это может бытьa || a = b
(как в Ruby ). Они могут отличаться, если у сеттера есть побочный эффект. Выбор одного может быть плох для пользователей в другом лагере. Мне лично нравитсяa || a = b
путь (путь Руби), но я не уверен, довольны ли все этим.Общий ответ на все вопросы о том, «почему эта языковая функция не была реализована», заключается в том, что команда, разработавшая язык, решила, что выгода не перевесит стоимость.
Стоимость может принимать разные формы. Для реализации языковой функции требуются время и усилия, но есть и внутренняя стоимость сложности: делает ли функция язык более сложным или неоднозначным, не пропорционально его потенциальной выгоде?
Гипотетический
||=
оператор делает что-то принципиально отличное от других составных операторов присваивания. В то время как другие операторы имеют чисто математический характер, этот отличается от других: он заменяет одно значение другим (в контексте, который вы описали).Учитывая эту неоднозначность (оператор выполняет две разные функции в зависимости от контекста), нетрудно понять, почему он не был включен в язык. Хотя вы утверждаете, что изменение
в
Выполнение нулевого слияния является ценной особенностью, но для меня это гораздо менее очевидно. Если должно произойти подстановка значений, кажется логичным (и более понятным) иметь оба значения справа от знака равенства, чтобы обеспечить визуальную индикацию того, что такая замена может произойти.
C # выбрал другой путь и использует специальный оператор для объединения нулей.
источник
foo = foo || bar
вы должны печататьfoo
дважды. Это и громоздко, и также склонно к рефакторингу опечаток.||=
в качестве нулевого оператора объединения не является интуитивно понятным и на самом деле выглядит тупо в кодовой форме. Где это действительно полезно, когда вы пытаетесь сделать булеву математику.function fulfill(inValue) { if(resolved || rejected) return false; /* Do stuff here */ return true; } resolved ||= fulfill(value)
Вы правы, что
||=
это полезная конструкция. Он существует в Perl.На самом деле Perl делает все это доступным:
Некоторые из них хороши (
.=
добавляет что-то в конец строки), другие - нет (&&=
???. Я полагаю, что переменная будет установлена в правую часть, если и она, и переменная верны. Но зачем вам это делать? ?)То, что включено в язык, действительно является чертой его философии дизайна.
источник
&&=
означает / делает.