11484 sujets

JavaScript, DOM et API Web HTML5

Bonjour

En JavaScript, si on définit une variable sans lui donner de valeur cette valeur est indéfinie.
Par exemple

            var Language  = 'fr';    /* on définit la variable Language en lui donnant une valeur */
            var info = (Language ? Language : 'en');

met la valeur de "info" à 'fr'
alors que

            var Language;            /* on définit la variable Language sans lui donner de valeur */
            var info = (Language ? Language : 'en');

met la valeur de "info " à 'en' car Language est définie mais sa valeur est indéfinie
Mais si on écrit

            //var Language;     /* on supprime la définition de la variable */
            var info = (Language ? Language : 'en');

On obtient une erreur "not defined"
Ma question: y a-t-il un moyen de tester si une variable est "not defined"?
J'ai trouvé la réponse :

var info = (typeof Language == 'undefined' ? 'en' : Language);
Salut PapyJP,

ce qui est à la mode en javascript pour faire ce genre de chose, c'est la syntaxe suivante :

var info = language || "en";


une explication pour les débutants si nécessaire :
- en javascript, l'opérateur || retourne la première valeur évaluée à true.
- combiné au fait qu'une variable vaut false dans les cas suivants : valeur omise, 0, null, false, NaN, undefined ou chaine de caractères vide ("")
cf les supers explication de MDN : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Boolean
Merci, mais c'est le genre de chose que par expérience professionnelle je refuse de faire. Le malheureux qui va devoir faire la maintenance du code dans 5 ans va se creuser la tête et finir par tout réécrire car c'est totalement incompréhensible, sauf si on met un commentaire de 10 lignes encadrées pour expliquer le pourquoi du comment, et même encore comme ça, je n'en suis pas sûr!

Mon principe de base c'est que les trois principales qualités d'un code sont
1) qu'il soit maintenable
2) qu'il soit maintenable
3) qu'il soit maintenable
tout le reste est secondaire
Entre
var info = (typeof Language == 'undefined' ? 'en' : Language);
et
var info = Language || "en";

Je trouve que la deuxième syntaxe est nettement plus lisible : si on connait le langage on comprend plus vite, pour ceux qui ne connaissent pas effectivement ça va demander un effort de recherche supplémentaire mais bon c'est au développeur à s'adapter et connaître le langage qu'il utilise -_-

Par contre il y a une différence notoire entre ces deux manières de procéder : si Language n'est pas définit la seconde va planter avec un joli :
ReferenceError: Language is not defined

Pour que ça fonctionne sans risque il faut bien préciser que Language est une propriété de l'objet window (s'il s'agit bien d'une variable globale).
var info = window.Language || "en";
var info = language || "en";

Sympa, je ne connaissais pas cette syntaxe raccourcie.

@PapyJP : Je ne trouve pas la solution de Sanchodellavega si difficile à appréhender, pas plus difficile en tout cas que les syntaxes raccourcies de php.
@PapyJP si vous voulez faire du code maintenable et compréhensible du tout venant il faut éviter d'utiliser les conditions ternaires...
var info = "en";

if ('Language' in window) {
    info = Language;
}