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
Ответы
Ответ 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/
Ответ 6
Я использовал бы тройную равную с тройной функцией для этого.
function myTest(x){
return x === undefined ? true: false;
}
Возвращает только true, если x undefined
См
(http://www.impressivewebs.com/why-use-triple-equals-javascipt/)
а также
(http://jsfiddle.net/V76W6/)