Code JavaScript ne fonctionne pas

Le problème exposé dans ce sujet a été résolu.

Bonjour, je débute tout juste en JavaScript, et mon code ci-dessous n’affiche aucune boîte de dialogue alors que je serais censé obtenir : "Bonjour!" puisque l’heure est indiquée à 16.

Mon code HTML (Cela ne semble pas poser de problème).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<html>
    <head>
        <title>JavaScript</title>
        <meta charset = "utf-8">
    </head>

<body>

    <h1>Tests en JavaScript</h1>
    <script src = "Tests.js"></script>

</body>

</html>

Mon code JavaScript :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
var heure = 16;

if (typeof(heure) == number){
   if (heure >= 0 && heure < 17){
      alert('Bonjour!');
   }

   else if (heure >= 17 && heure <= 23){
      alert('Bonsoir!');
   }

   else{
      alert('Erreur');
   }
}

else{
    alert('Erreur!');
}

C’est un code basique qui doit en faire rire plus d’un, toutefois si vous pouvez m’aidez un petit peu… :-(

Du coup, pourquoi cette notation? Typeof récupère le type d’une variable dans un string?

Typeof est un opérateur (donc il s’écrire sans parenthèse car ce n’est pas une fonction comme var ou function).

1
if (typeof heure === 'number')

Cet opérateur permet de récupérer le type d’une entrée. Le type sera retourné en format texte.

Pourquoi === et pas ==? On sait déjà que typeof retourne un string…

EDIT : J’ai un autre petit soucis. J’ai modifié mon code comme suit :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
var heure = 24;
var ternaire;


if (typeof(heure) == 'number'){

   if (heure < 0 || heure > 23)
      alert('Erreur');

   else
      ternaire = (heure < 17) ? "Bonjour!" : "Bonsoir!";
      alert(ternaire);
}

else
   alert('Erreur!');

Cela fonctionne correctement, mais à la fin j’obtiens une boîte de dialogue qui indique ’undefined’. Le problème ne persiste pas quand je rajoute des accolades, que j’ai ici enlevées pour moins de lourdeur.

Notez que j’ai mis heure = 24 donc le problème semble provenir du deuxième if

J’ai changé la ligne var ternaire; par var ternaire = ""; et cette fois-ci une boîte de dialogue s’affiche avec rien dedans.

+0 -0

Deux rappels :

  • l’opérateur "===" est préféré en tout cas en JS, d’après Douglas Crockford, un des créateurs de Javascript, cet opérateur est utilisé dans la grande majorité des cas (pour ne pas dire partout), il est donc préférable d’être cohérent et de se mettre à l’utiliser partout ;
  • typeof ne prends pas de parenthèses.

Pour ton autre problème, il est parfaitement normal que le code ne fonctionne pas sans accolades, car en l’absence d’icelles, JS n’exécute que la première instruction qui suit le else, ici ternaire = (heure < 17) ? "Bonjour!" : "Bonsoir!";, puis ton alert est exécuté hors du else ; or ici, c’est ton if qui s’exécute (heure=24), donc la variable ternaire reste à sa valeur initiale, c’est-à-dire aucune. Pour y remédier, if faut mettre des accolades ou instancier la variable var ternaire = "ma_valeur";, mais dans ce cas, l’indentation est incorrecte.

+0 -0

Pourquoi === et pas ==? On sait déjà que typeof retourne un string…

Osimoquus

Quand j’ai repris le code, la première chose que j’ai faite c’est d’écrire == :

1
if (typeof heure == 'number')

En me disant que le === était inutile et que c’était un abus. J’ai regardé la documentation, j’ai vu === alors j’ai remis === au lieu de ==. Je pense que pour éviter des erreurs de comparaison pour les personnes qui ne sont pas à l’aise avec la comparaison en JS (EDIT : Prise en compte du message de Titi_Alone) le === est mieux.

Tu as écris :

1
2
3
4
5
6
7
8
9
if (typeof(heure) == 'number'){

   if (heure < 0 || heure > 23) {
      alert('Erreur');
   } else {
      ternaire = (heure < 17) ? "Bonjour!" : "Bonsoir!";
   }
   alert(ternaire);
}

Tu ne peux pas avoir deux ligne sans accolade (ce n’est pas du python). :p

Ensuite tu peux faire le code suivant si tu veux éviter d’indenter à droite.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
(function(heure) {
    var ternaire;

    if (typeof(heure) != 'number')
        return alert('Erreur!');

    if (0 <= heure && heure < 24)
        return alert('Erreur!');

    ternaire = (heure < 17) ? "Bonjour!" : "Bonsoir!";
    alert(ternaire);
})(24);
+0 -0

J’ai une autre question et je préfère ne pas créer un nouveau sujet.

Si je ne pose pas de valeur numérique d’initialisation d’une variable x en js, laquelle des quatre syntaxes est la bonne?

1
2
3
4
var i;
var i = "";
var i = null;
var i = undefined;

J’ai tendance à déclare i selon le type de la variable pour me faire un repère visuel :

1
2
3
4
var i = 0; // numérique
var str = ""; // texte
var func = null; // function
var obj = null; // ou {} si j'utilise l'objet directement après.

Je fais var mavariable; quand c’est une variable temporaire de transition à un état à l’autre. Le plus souvent dans une boucle for pour ne pas perdre en lisibilité.

1
2
3
for (var i = 0, obj; objets.cle.length; i++) {
   obj = objets.cle[i];
}

J’ai tendance à déclare i selon le type de la variable pour me faire un repère visuel :

1
2
3
4
var i = 0; // numérique
var str = ""; // texte
var func = null; // function
var obj = null; // ou {} si j'utilise l'objet directement après.
A-312

C’est une assez mauvaise idée en générale. Il vaut mieux ne pas initialiser. Ce sera alors undefined, et vous pourrez en tout temps vérifier si vous avez assigné une valeur ou pas.

A noté que les variables déclarées dans l’entête for comme "obj" n’existeront plus en dehors (à la fin) de la boucle for. ;)

A-312

C’est faux.

1
2
3
for (var i = 0; i < 10; i++) {
}
console.log(i === 10) // true

Essayez de ne jamais var, ça vous évite d’avoir à apprendre ce genre spécificités absurdes. var n’existe que pour garder la compatibilité avec les vieux trucs écrits en JS. Il n’y a plus aucune justification pour continuer à taper var dans un truc que vous écrivez en JS.

Pour revenir à typeof, ça fonctionne avec des parenthèses parce qu’elles n’ont aucun effet. Faire typeof((((10)))) c’est environ comme ((((10))))-(((2))) === (((((8))))).

+0 -0

@Victor : Donc je déclare les variables comme en Python désormais?

Osimoquus

Oui, je te recommande ça. Bon normalement tu devrais très rarement avoir besoin de faire ça. Si tu programmes proprement, t’as zéro var et presque jamais de let, t’as quasiment que des const.

Pour réitérer mon argument : si tu initialises tes variables à une valeur lambda du type que tu veux utiliser, dans le but de ne jamais utiliser cette valeur, ça n’a pas de sens et ça t’empêche de vérifier si tu as déjà assigné volontairement une valeur à cette variable.

+2 -0

@victor Lapsus ou ironie dans ton message ? Pour le premier paragraphe.


J’étais persuadé qu’il vallait mieux faire :

if (machin === null) ou if (machin === "")

Plutôt que if (typeof machin === "undefined") ou if (machin === undefined) car undefined n’était pas réservé, je ne sais pas si c’est toujours le cas ?

@victor Lapsus ou ironie dans ton message ? Pour le premier paragraphe.

Ah non j’ai juste pas réfléchi à ce que voulait dire "comme en python". Ma faute. Lapsus, donc, quand j’ai dit oui à ça. Mais le reste j’y tiens :

Si tu programmes proprement, t’as zéro var et presque jamais de let, t’as quasiment que des const.

let x si vraiment t’as besoin de plus tard lui assigner une chaine genre x = 'foo'.

Aucun intérêt à faire

1
2
let x = ''
x = 'foo'

J’étais persuadé qu’il vallait mieux faire :

if (machin === null) ou if (machin === "")

Plutôt que if (typeof machin === "undefined") ou if (machin === undefined) car undefined n’était pas réservé, je ne sais pas si c’est toujours le cas ?

A-312

Non ce n’est plus le cas, tu ne peux pas assigner undefined. En revanche ça ne doit pas thrower, parce que ça casserait la compatibilité descendante. C’est le genre de doute que tu peux vérifier par toi même : undefined = 12; console.log(undefined) ;)

Sinon, préfère if (typeof x === 'undefined').

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte