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

Javascript: определить переменную, если она не существует

Мне кажется, что я пытаюсь сделать что-то супер простое, но просто глупо об этом.

все, что я хочу сделать, это посмотреть, была ли ранее установлена ​​переменная, а если она НЕ, установите ее со значением по умолчанию.... вот пример:

if(!embed_BackgroundColor) {
    var embed_BackgroundColor;
    embed_BackgroundColor = "#F4F4F4";
}

Итак, как только вы перестанете смеяться над моим кодом... ПОЧЕМУ это переписывание переменной независимо от того, что?

пожалуйста, сохраните мои нервы;)

4b9b3361

Ответ 1

if (typeof variable === 'undefined') {
    // variable is undefined
    // eg:
    // var variable = "someValue";
}

Ответ 2

Стиль Pro:

var SomeVar = SomeVar || 'Default Value';

Ответ 3

В этом случае было бы хорошей практикой кодирования, чтобы использовать тернарный оператор. Кроме того, при сравнении с typeof вам не нужно иметь три одинаковых знака. Это наиболее сжатое решение:

b = typeof(b) == 'undefined' ? 0 : b;

Это, надеюсь, сэкономит ваши руки некоторое время.

Ответ 4

Чтобы ответить на ваш вопрос о том, ПОЧЕМУ это происходит, это было всего лишь немногим более двух лет и месяц: 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 или это все испортит.

Ответ 5

Я предпочитаю этот синтаксис:

embed_BackgroundColor = embed_BackgroundColor || "#F4F4F4"

Не может быть намного проще! И он работает, даже если он был var'd.

Ответ 6

Если это глобальная переменная, мне нравится делать:

var defineMe = window.defineMe || 'I will define you now';

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

Ответ 7

Если 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

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

Ответ 8

Я следую блогу 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.");
  • Появится первый оператор предупреждения: "jStuff - undefined."
  • Будет отображаться второй оператор предупреждения: "Определен jStuff".
  • В последнем объявлении будет отображаться указанное предупреждение, а затем эта строка будет сохранена в переменной str.

Ответ 9

Я думаю, что ваш опубликованный код должен работать. Если ваше исходное значение равно 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;

Ответ 10

Я предпочитаю общее решение в стиле PHP:

function isset(x) { return typeof(x)!='undefined'; }

Ответ 11

Поскольку ваш блок if будет выполняться, если embed_BackgroundColor - false, 0, "", null, undefined или NaN.

Но embed_BackgroundColor не следует перезаписывать, если он уже был назначен другой непустой строке... Или, по крайней мере, это не на моем конце.

Возможно, это случай конфликтных областей, как указал Аарон Цянь.

Ответ 12

Лучший вариант:

if (typeof someVar === 'undefined') someVar = someValue;