JavaScript: определить переменную, если она не существует - PullRequest
51 голосов
/ 03 апреля 2009

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

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

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

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

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

Ответы [ 12 ]

75 голосов
/ 07 марта 2014

Pro стиль:

var SomeVar = SomeVar || 'Default Value';
58 голосов
/ 03 апреля 2009
if (typeof variable === 'undefined') {
    // variable is undefined
    // eg:
    // var variable = "someValue";
}
44 голосов
/ 03 апреля 2009

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

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

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

28 голосов
/ 23 мая 2011

Чтобы на самом деле ответить на ваш вопрос, ПОЧЕМУ это происходит - прошло чуть более двух лет и месяц: D - это из-за подъема переменной .

По существу, перед выполнением кода в глобальной области видимости или внутри функции есть фаза, где код сканируется для всех объявлений var и function (не путать с выражениями выражений , но это другая история).
Все эти переменные и функции затем объявляются внутри текущей области, и только после этого код фактически выполняется.

Это происходит независимо от их положения в коде, с областями, соответствующими телам функций, а не блокам операторов. И что делает это еще более нелогичным, даже если вы установите начальное значение для переменных в их объявлениях, они будут оставаться «пустыми», пока объявление не будет достигнуто снова в нормальном потоке выполнения .

Поэтому, когда вы пишете:

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

что на самом деле происходит так:

  1. Код сканируется для объявлений var. embed_BackgroundColor объявляется внутри этой области независимо от того, было ли оно уже объявлено или нет. Его начальное значение не определено.

  2. Начинается выполнение кода. Оператор if выполняется. Переменная объявлена ​​, но ее значение не определено, поэтому условие истинно. Использование typeof не поможет вам различить необъявленную и объявленную, но еще не установленную переменную. В любом случае это не имеет значения.

  3. Декларация var достигается нормальным потоком кода. Если бы вы дали переменной начальное значение, она была бы установлена ​​сейчас. В этом случае ничего не происходит.

  4. embed_BackgroundColor устанавливается на значение "#F4F4F4".

Итак, суть в следующем: вы можете использовать typeof variable == 'undefined', как видно из других ответов, или даже просто '! Variable', как вы изначально использовали, но не используйте var, иначе это все испортит.

10 голосов
/ 03 июля 2014

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

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

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

10 голосов
/ 02 ноября 2011

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

embed_BackgroundColor = embed_BackgroundColor || "#F4F4F4"

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

1 голос
/ 03 декабря 2010

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

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

0 голосов
/ 11 ноября 2015

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

if (typeof someVar === 'undefined') someVar = someValue;
0 голосов
/ 19 января 2015

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

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

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

0 голосов
/ 03 июля 2012

Я слежу за блогом Криса Уэста и вижу, что он опубликовал довольно крутой способ на 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 не определено».
  • Во втором операторе оповещения появится сообщение «jStuff определен».
  • В последнем операторе оповещения отобразится указанное оповещение, а затем эта строка будет сохранена в переменной str.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...