web-dev-qa-db-fra.com

javascript: définit une variable si elle n'existe pas

je me sens comme si j'essayais de faire quelque chose de super simple, mais juste d'être stupide à ce sujet.

tout ce que je veux faire est de voir si une variable a été définie précédemment, et si elle n’a PAS été définie, définissez-la avec une valeur par défaut .... en voici un exemple:

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

alors, une fois que vous arrêtez de rire de mon code ... POURQUOI écrase-t-il la variable, quoi qu'il arrive?

s'il te plaît sauve mes nerfs;)

50
johnnietheblack
if (typeof variable === 'undefined') {
    // variable is undefined
    // eg:
    // var variable = "someValue";
}
59
Paolo Bergantino

Style pro:

var SomeVar = SomeVar || 'Default Value';
75
calmbird

Ce serait une bonne pratique de codage dans ce cas d'utiliser l'opérateur ternaire. De plus, vous n'avez pas besoin d'avoir trois signes égaux pour comparer avec typeof. C'est la solution la plus concise:

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

Cela, espérons-le, vous fera gagner du temps.

43
Jhuni

Pour répondre réellement à votre question de savoir pourquoi cela se produit - cela ne fait qu'un peu plus de deux ans et un mois: D -, c'est à cause de levage variable

Fondamentalement, il y a une phase avant l'exécution du code dans la portée globale ou à l'intérieur d'une fonction où le code est analysé pour toutes les déclarations var et function (à ne pas confondre avec la fonction expressions, mais c'est une histoire différente).
Toutes ces variables et fonctions sont ensuite déclarées dans la portée actuelle et seulement après le code est réellement exécuté. 

Cela se produit quelle que soit leur position dans le code, les étendues correspondant aux corps de fonction et non à des blocs d'instructions. Et ce qui rend cela encore plus contre-intuitif, même si vous définissez une valeur initiale pour les variables dans leurs déclarations, elles resteront toujours "vides" jusqu'à ce que la déclaration soit à nouveau atteinte dans le flux d'exécution normal .

Alors quand tu écris:

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

ce qui se passe réellement est la suivante:

  1. Le code est scanné pour les déclarations var. embed_BackgroundColor est déclaré dans cette étendue, qu'il ait déjà été déclaré ou non. Sa valeur initiale est indéfinie.

  2. L'exécution du code commence. L'instruction if est exécutée. La variable est déclarée, mais comme sa valeur est indéfinie, la condition est vraie. Utiliser typeof ne vous aiderait pas à distinguer ici entre une variable non déclarée et une variable déclarée mais non encore définie. Cela ne fait aucune différence de toute façon.

  3. La déclaration var est atteinte par le flux normal du code. Si vous aviez donné à la variable une valeur initiale, elle aurait été définie maintenant. Dans ce cas, rien ne se passe.

  4. embed_BackgroundColor est défini sur la valeur "#F4F4F4".

En résumé, vous pouvez utiliser typeof variable == 'undefined' comme indiqué dans les autres réponses, ou même simplement '! Variable' tel que vous l'utilisiez initialement, mais n'utilisez pas var ou cela ruinerait tout.

28
Zecc

Je préfère cette syntaxe:

embed_BackgroundColor = embed_BackgroundColor || "#F4F4F4"

Ne peut pas être beaucoup plus simple que ça! Et cela semble fonctionner même si cela a été modifié.

10
Moss

Si c'est une variable globale, j'aime bien faire:

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

Il est important d'utiliser l'espace de noms de la fenêtre, car la référence à des variables non définies provoquera de très mauvaises erreurs, mais pas les propriétés non définies.

10
user3803037

Si embed_BackgroundColor est un paramètre d’une fonction qui n’a pas été transmise, vous pouvez définir une valeur par défaut avec

embed_BackgroundColor ? embedBackgroundColor : embed_BackgroundColor = "#F4F4F4";

Exemple de fonction complète

function colorFunctionThing(embed_BackgroundColor) {
  embed_BackgroundColor ? embed_BackgroundColor : embed_BackgroundColor = "#F4F4F4";
  console.log(embed_BackgroundColor);
};
colorFunctionThing();

Les sorties

#F4F4F4

Ce n’est pas exactement ce que vous cherchiez, mais vous avez toujours bon à savoir.

1
Mike Grace

Je suis le blog de Chris West et j'ai constaté qu'il avait posté un moyen plutôt cool sur http://gotochriswest.com/blog/2012/07/02/javascript-define-if-undefined/ - .

En gros, vous avez la définition de la fonction define et vous l'utilisez ensuite comme ceci:

define("embed_BackgroundColor", "#F4F4F4");

Le code ci-dessus définira enbed_BackgroundColor dans le contexte global s'il n'est pas déjà défini. L'exemple que Chris a utilisé est un peu plus utile et se présente comme suit:

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.");
  • La première déclaration d'alerte affichera "jStuff n'est pas défini".
  • La deuxième instruction d'alerte affichera "jStuff est défini".
  • La dernière instruction d'alerte affichera l'alerte spécifiée, puis cette chaîne sera stockée dans la variable str.
1
Xavier Botomon

Je pense que votre code posté devrait fonctionner. Sauf si votre valeur d'origine est 0.

Le problème est ailleurs.

Je suppose que vous avez défini 'embed_BackgroundColor' hors de la portée de votre code. Et lorsque vous exécutez votre code, cette variable est indéfinie dans l'étendue de votre code et se voit attribuer la valeur par défaut.

Voici un exemple:

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;
0
Aaron Qian

Je préfère une solution générale de style PHP:

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

0
Thinker

Meilleure option:

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

Parce que votre bloc if sera exécuté si embed_BackgroundColor est false, 0, "", null, undefined ou NaN.

Mais embed_BackgroundColor ne doit pas être écrasé s'il a déjà été affecté à une autre chaîne non vide ... Ou du moins, ce n'est pas mon cas.

Peut-être s'agit-il d'un cas de conflit, comme l'a souligné Aaron Qian.

0
Bella I.