Как работает логическое назначение 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;