Ответ 1
if (typeof variable === 'undefined') {
// variable is undefined
// eg:
// var variable = "someValue";
}
Мне кажется, что я пытаюсь сделать что-то супер простое, но просто глупо об этом.
все, что я хочу сделать, это посмотреть, была ли ранее установлена переменная, а если она НЕ, установите ее со значением по умолчанию.... вот пример:
if(!embed_BackgroundColor) {
var embed_BackgroundColor;
embed_BackgroundColor = "#F4F4F4";
}
Итак, как только вы перестанете смеяться над моим кодом... ПОЧЕМУ это переписывание переменной независимо от того, что?
пожалуйста, сохраните мои нервы;)
if (typeof variable === 'undefined') {
// variable is undefined
// eg:
// var variable = "someValue";
}
Стиль Pro:
var SomeVar = SomeVar || 'Default Value';
В этом случае было бы хорошей практикой кодирования, чтобы использовать тернарный оператор. Кроме того, при сравнении с typeof вам не нужно иметь три одинаковых знака. Это наиболее сжатое решение:
b = typeof(b) == 'undefined' ? 0 : b;
Это, надеюсь, сэкономит ваши руки некоторое время.
Чтобы ответить на ваш вопрос о том, ПОЧЕМУ это происходит, это было всего лишь немногим более двух лет и месяц: D -, из-за переменной подъема.
В принципе, перед выполнением кода в глобальной области видимости или внутри функции, где код сканируется для всех объявлений var
и function
(до путаницы с выражениями функций, но это другая история).
Все эти переменные и функции затем объявляются внутри текущей области, и только после этого код действительно выполняется.
Это происходит независимо от их положения в коде, с областями, соответствующими телам функций, а не блокам операторов. И что делает это еще более противоречивым, даже если вы устанавливаете начальное значение переменных в своих объявлениях, они все равно останутся "пустыми" до тех пор, пока объявление не станет снова достигнут в нормальном потоке выполнения.
Итак, когда вы пишете:
if(!embed_BackgroundColor) {
var embed_BackgroundColor;
embed_BackgroundColor = "#F4F4F4";
}
что происходит на самом деле:
Код сканируется для объявлений var
. embed_BackgroundColor
объявляется внутри этой области, независимо от того, было ли оно уже объявлено или нет. Его начальное значение undefined.
Выполняется запуск кода. Выполняется инструкция if
. Объявлена переменная, но ее значение undefined, поэтому условие истинно. Использование typeof
не помогло бы вам отличить здесь между необъявленной и объявленной, но еще не заданной переменной. Это не имеет никакого значения.
Объявление var
достигается путем нормального потока кода. Если бы вы дали переменной начальное значение, она была бы установлена сейчас. В этом случае ничего не происходит.
embed_BackgroundColor
установлено значение "#F4F4F4"
.
Итак, нижняя строка: вы можете использовать typeof variable == 'undefined'
, как видно из других ответов, или даже обычную "переменную", как вы изначально использовали, но не используете var
или это все испортит.
Я предпочитаю этот синтаксис:
embed_BackgroundColor = embed_BackgroundColor || "#F4F4F4"
Не может быть намного проще! И он работает, даже если он был var'd.
Если это глобальная переменная, мне нравится делать:
var defineMe = window.defineMe || 'I will define you now';
Важно использовать пространство имен в окнах, поскольку ссылки на переменные undefined приводят к очень плохим ошибкам, но ссылки на свойства undefined не будут.
Если embed_BackgroundColor является параметром в функции, которая не прошла, вы можете установить значение по умолчанию с помощью
embed_BackgroundColor ? embedBackgroundColor : embed_BackgroundColor = "#F4F4F4";
Полный пример функции
function colorFunctionThing(embed_BackgroundColor) {
embed_BackgroundColor ? embed_BackgroundColor : embed_BackgroundColor = "#F4F4F4";
console.log(embed_BackgroundColor);
};
colorFunctionThing();
Выходы
#F4F4F4
Не совсем то, что вы искали, но все же очень полезно знать.
Я следую блогу Chris West и вижу, что он опубликовал довольно классный способ http://gotochriswest.com/blog/2012/07/02/javascript-define-if-undefined/.
В принципе, у вас есть определение для функции define
, а затем используйте его следующим образом:
define("embed_BackgroundColor", "#F4F4F4");
Приведенный выше код определит enbed_BackgroundColor в глобальном контексте, если он еще не определен. Пример, который использовал Крис, немного полезнее и выглядит следующим образом:
alert("jStuff is " + (typeof jStuff == "undefined" ? "un" : "") + "defined.");
define("jStuff.alert", function(msg) {
alert(msg);
return msg;
});
alert("jStuff is " + (typeof jStuff == "undefined" ? "un" : "") + "defined.");
var str = jStuff.alert("Show and save this message.");
str
.Я думаю, что ваш опубликованный код должен работать. Если ваше исходное значение равно 0.
Проблема в другом месте.
Я предполагаю, что вы определили "embed_BackgroundColor" вне сферы вашего кода. И когда вы запускаете свой код, эта переменная undefined находится в области вашего кода и будет присвоена значение по умолчанию.
Вот пример:
var embed_BackgroundColor = "#FF0000";
(function(){
if(!embed_BackgroundColor) {
var embed_BackgroundColor;
embed_BackgroundColor = "#F4F4F4";
}
alert(embed_BackgroundColor); // will give you #F4F4F4
})();
alert(embed_BackgroundColor); // will give you #FF0000;
Я предпочитаю общее решение в стиле PHP:
function isset(x)
{ return typeof(x)!='undefined'; }
Поскольку ваш блок if
будет выполняться, если embed_BackgroundColor
- false
, 0
, ""
, null
, undefined
или NaN
.
Но embed_BackgroundColor
не следует перезаписывать, если он уже был назначен другой непустой строке... Или, по крайней мере, это не на моем конце.
Возможно, это случай конфликтных областей, как указал Аарон Цянь.
Лучший вариант:
if (typeof someVar === 'undefined') someVar = someValue;