Как работает логическое назначение JavaScript?

В javascript, если у нас есть некоторый код, например

var a = "one";
var b = q || a;
alert (b);

Логический оператор OR присваивает значение b, а предупреждение будет "одним".

Ограничено ли это только назначением или мы можем использовать его везде?

Кажется, что пустая строка обрабатывается так же, как undefined. Правильно ли это?

Как это работает с переменными AND? Как насчет их комбинаций?

Каков хороший пример того, когда использовать эти идиомы, или когда не нужно?

Ответ 1

Для оценки q || a a, q должно быть "ложным" значением. То, что вы сделали, называется "Оценка короткого замыкания".

Отвечая на ваши вопросы:

  • Логические операторы (например, и - &&, или - ||) могут использоваться и в других ситуациях. В более общем плане, в условных выражениях типа if. Подробнее здесь

  • Пустая строка не рассматривается как undefined. Оба значения являются ложными. Есть еще несколько фальшивых значений. Подробнее здесь

  • AND, или && в JavaScript, не является переменной. Это оператор

  • Идиома, которую вы использовали, довольно распространена.

    var x = val || 'default'; //is generally a replacement for

    var x = val ? val : 'default' //or

    if (val) var x = val; else var x = 'default';

Ответ 2

Способ || работает в Javascript:

  • Если левый операнд оценивается как true, верните левый операнд
  • В противном случае верните правый операнд

& & работает аналогично.

Вы можете использовать это для проверки наличия внутри строки, например:

var foo = (obj && obj.property)

установит foo в obj.property, если obj определено и "правдиво".

Ответ 3

Это поведение распространяется на другие языки сценариев, такие как Perl. Логический оператор OR может использоваться как синтаксическая стенограмма для указания значений по умолчанию из-за того, что логический оператор OR прекращает оценивать свои операнды, когда он встречает первое выражение, которое оценивает значение true: "оцените первый операнд и если значение интерпретируется а не false, назначьте его. В противном случае повторите для второго операнда."

Я нахожу, что я часто использую это поведение для указания значений по умолчанию для параметров функции. Например.

function myFunction(foo, bar) {
    var fooValue = foo || "a";

    // no need to test fooValue -- it guaranteed to be defined at this point
}

Ответ 4

Я не совсем уверен, что следую твоему вопросу. Вы можете использовать выражение везде, где вы можете использовать выражение, а логический оператор в двух выражениях приводит к выражению.

alert(q||a);
alert(true||false);

var x=5;
var y=0;
if (y!=0 && x/y>2) { /*do something*/ }

Последний бит полезен. Как и большинство языков, Javascript "коротких замыканий" AND и OR. Если первая часть И является ложной, она не оценивает второй бит - сохранение разделителя на-0. Если первая часть OR истинна, она не оценивает вторую.

Но вы можете использовать логические операторы везде, где вы можете использовать выражение.

Ответ 5

Javascript оценивает логику по истине/ложности. Значения, такие как (false, "", null, undefined, 0, -0), оцениваются как логические ложные.

Объедините это с ленивой оценкой, теперь операции "OR" оцениваются от left to right и останавливаются один раз true. Так как в вашем примере истинность не является буквально логическим значением, возвращается значение.

В этом случае:

x = 0; y = 5; alert(y || x)/*returns 5*/;  alert(x || y)/*also returns 5*/;

это могут быть и другие объекты.

functionThatReturnsTrue() || functionThatDoesSomething();

Ответ 6

IMHO - не использовать для присвоения булевого типа. Это может сбить с толку. Как undefined! == false, то есть false является значением.

например. Если u хочет скопировать значение поля из объекта тогда и только тогда, когда это поле определено

var bar.value = false;
var foo = true;

var foo = bar.value || foo;  // ==> should be false as bar.value is defined

Для назначения булевого типа u действительно должен использовать

var foo = (bar.value !== undefined) ? bar.value : foo;