Подтвердить что ты не робот

Javascript || или оператор с неопределенной переменной

Я читал в последнее время одну статью, которую я прочитал, из Opera.

http://dev.opera.com/articles/view/javascript-best-practices/

В этой статье они пишут следующее:

Другая распространенная ситуация в JavaScript обеспечивает заданное значение для переменная, если она не определена, например так:

if(v){
  var x = v;
} else {
  var x = 10;
}

Обозначение ярлыка для этого двойной символ:

var x = v || 10;

По какой-то причине я не могу заставить это работать для меня. Действительно ли можно проверить, определено ли v, если не x = 10?

- Спасибо. Bryan

4b9b3361

Ответ 1

Эта статья в Opera дает плохое описание того, что происходит.

Хотя верно, что x получит значение 10, если v - undefined. Также верно, что x будет 10, если v имеет любое значение "falsey".

Значения "falsey" в javascript:

  • 0
  • null
  • undefined
  • NaN
  • "" (пустая строка)
  • false

Итак, вы можете видеть, что есть много случаев, когда x будет установлен в 10, кроме как только undefined.

Здесь приведена подробная документация, в которой подробно описаны логические операторы. (Этот является "логическим ИЛИ".) Он дает несколько примеров его использования для такого назначения.

Быстрый пример: http://jsfiddle.net/V76W6/

var v = 0;

var x = v || 10;

alert( x ); // alerts 10

Назначьте v любое из значений false, которые я указал выше, и вы получите тот же результат.

Ответ 2

var x = v || 10;

Этот оператор ( "логический" или "короткозамкнутый" оператор ИЛИ) обычно проверяет значение v, и если это "ложное" значение (т.е. оно будет работать как условие, используемое в выражении if), 10 станет значением x, иначе v (а если 10 была функцией, никогда не выполняться).

undefined, null и 0 - все примеры значений фальши, которые может содержать переменная (да, даже первая), и оператор (или оператор) действует соответственно. Напротив, все объекты и массивы (не считая нуля) являются "правными" значениями, что позволяет использовать такие вещи (используемые в коде трекера Google Analytics):

var _gaq = _gaq || []; // Makes a new array _gaq if it is not already there

Однако, если ссылочная переменная не объявлена ​​ нигде внутри цепочки областей видимости, то возникает исключение JavaScript.

Один из способов избежать этого - объявить все ваши глобальные переменные с самого начала:

var iAmAGlobalVariable;  // Holds the value undefined by default

Если это невозможно, вы должны использовать оператор typeof. Он не пытается оценить его операнд, и поэтому исключение не произойдет:

var x;
if(typeof v != 'undefined' && v) {
    x = v;
} else {
    x = 10;
}

Или даже лучше, если вы знаете, что переменная будет глобальной переменной, вы можете рассматривать ее как свойство глобального (окна) объекта:

var x = window.v || 10;

Ответ 3

Если v оценивается как false (например, 0, null, false), то это не сработает. Вы можете вручную проверить undefined:

var x = v !== undefined ? v : 10;

Ответ 4

Я бы просто использовал try-catch

var x = 0;

try
{
    x = v;
}
catch(err)
{
    x = 10;
}

Ответ 5

Вот как это сделать:

var v;         //declare v as undefined
//  v = 5;     //if uncommented x will be 5   

var x = v || 10;
alert(x);      //output: 10

http://jsfiddle.net/uLLtu/1/