IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Syntaxe Javascript non comprise


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    Par défaut Syntaxe Javascript non comprise
    Bonjour,
    en surfant sur différent site je retrouve souvent des lignes de codes dont je ne comprends pas la syntaxe, ni ce qu'elles font.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (navigator.platform) {                                               //win32
        var ptf = ("" + navigator.platform).toLowerCase();    //ptf  = win32
        "mac" != ptf.substr(0, 3) && (is_osx = !1)		 //   ==> que fait cette ligne : pas une affectation : des tests à priori mais pas dans un if, ni d'affectation. Je ne comprend pas l'intérêt de ce genre de ligne ?
    }
     
    Ou bien encore (toujours dans le même style)
    var ua = navigator.userAgent.toLowerCase();
    0 <= ua.indexOf("safari") && -1 == ua.indexOf("chrome") && (is_safari = !0);    //la encore que fait cette ligne  ??
    0 <= ua.indexOf("chrome") && (is_safari || is_firefox || (is_chrome = !0));
    Il y a une notion javascript qui doit m'échapper.

    Merci pour vos explications.

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "mac" != ptf.substr(0, 3) && (is_osx = !1)
    C'est effectivement un "if" ou plutôt une manière de faire un "if". Le principe est simple, il consiste à exploiter le comportement du "et" logique (&&):
    dans une condition avec plusieurs assertions séparées par &&, toutes les assertions doivent être vérifiées pour que cette condition réussisse. Ce qui signifie que si la première assertion est vérifiée alors on teste la deuxième et ainsi de suite. Par contre, dés qu'une assertion n'est pas vérifiée, la condition est alors fausse et il est inutile de tester les assertions suivantes (car quelque soit leur résultat ça ne changera rien). Ceci a pour conséquence que ces assertions sont tout simplement ignorées comme si elles n'existaient pas.

    Pour en revenir au bout de code, si la condition "mac" != ptf.substr(0, 3) échoue, l'affectation is_osx = !1 n'aura pas lieu (contrairement à la guerre de Troyes), si elle réussit l'affectation is_osx = !1 aura lieu.

    Détail syntaxique, le pourquoi des parenthèses autour de l'affectation:
    C'est simplement dû à la précédence des opérateurs, la précédence de && est plus élevée que celle de =, donc en mettant l'affectation entre parenthèses, je m'assure que cette ligne n'est pas interprétée comme: ("mac" != ptf.substr(0, 3) && is_osx) =!1 (ce qui ne voudrait pas dire grand chose vue que "mac" != ptf.substr(0, 3) && is_osx ne constitue pas une lvalue.)

    Quant au !1, c'est juste une manière plus courte d'écrire false.

    Bref, cette ligne peut plus clairement s'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( "mac" != ptf.substr(0, 3) ) {
        is_osx = false;
    }
    De la même manière avec le "ou" logique, on peut faire un if then else de cette manière: assertion && then || else.
    (Le || quant à lui évalue la suite si l'assertion précédente échoue).

    Ce type d'écriture un peu cryptique émane plutôt du geek qui aime ce genres de raccourcis (quoi qu'il en soit ça reste relativement courant), mais plus fréquemment on peut le rencontrer lorsqu'un code est passé par un minifier pour réduire sa taille.

    Les autres lignes fonctionnent sur le même principe.

  3. #3
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    joli

    Mais quitte à condenser, j'aurais plutôt fait ça:
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    const is_osx=ptf.substr(0,3)=="mac";
    ça évite d'avoir à déclarer is_osx au préalable

  4. #4
    Membre émérite
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 57
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Par défaut Merci pour cet éclaircissement
    Ma culture informatique avait bien besoin de cette explication !
    Malgré la clarté de la formulation de CosmoKnacki, autant je crois (j'ai cru ?) comprendre la ligne 8, autant cela je suis perplexe pour la 9
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0 <= ua.indexOf("chrome") && (is_safari || is_firefox || (is_chrome = !0));
    Comment on pourrait tomber sur une valeur vraie de is_safari si c'est à la ligne précédente que se fait l'affectation? Qu'est-ce que je rate ?

    Et attention de ne pas induire en erreur les néophytes qui pourraient confondre Troie, sa guerre, son cheval, Giraudoux, avec Troyes, sa bataille (1940), son andouillette, Chrétien (de)

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Si on prend les deux dernières lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    0 <= ua.indexOf("safari") && -1 == ua.indexOf("chrome") && (is_safari = !0);
    0 <= ua.indexOf("chrome") && (is_safari || is_firefox || (is_chrome = !0));
    L'affection de is_safari à true (!0) ne se produit que si la condition 0 <= ua.indexOf("safari") && -1 == ua.indexOf("chrome") réussit. Mais dans le cas contraire, on peut supposer que is_safari est à false (ou quelque chose qui peut se caster en false comme undefined). On peut aussi supposer qu'il en est de même pour is_firefox (qui doit être traité avant, dans une partie qui n'apparaît pas dans l'extrait).
    Donc, dans ce cas, on a dans la dernière ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    0 <= ua.indexOf("chrome") && (is_safari || is_firefox || (is_chrome = !0));
    // ^                          ^-- false    ^-- false      ^-- l'affectation de is_chrome a lieu
    // |
    // +--- on trouve "chrome" dans la chaîne ua du user agent (donc true)
    Si dans le cas contraire is_safari ou is_firefox sont à true, on arrête les frais car la condition a réussi, et l'affection de is_chrome n'a pas lieu.

    Pour rappel sur ce type de notation:
    • Avec &&: on continue si c'est true, on s'arrête si c'est false
    • Avec ||: on continue si c'est false, on s'arrête si c'est true


    (À noter que c'est se donner beaucoup de mal pour quelque chose qu'on peut aussi facilement baratiner qu'un user agent.)

Discussions similaires

  1. Syntaxe Javascript/jQuery non comprise
    Par Médinoc dans le forum jQuery
    Réponses: 1
    Dernier message: 13/01/2012, 16h54
  2. Syntaxe non comprise
    Par grassel dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 29/03/2009, 20h02
  3. [XSLT] Syntaxe des namespaces (ns:tag) non comprise
    Par LoK dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 31/12/2006, 10h39
  4. erreur de syntaxe javascript dans ma page
    Par Oluha dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 01/02/2005, 14h53
  5. Variables javascript non correctement définies
    Par LLaurent dans le forum XMLRAD
    Réponses: 5
    Dernier message: 11/05/2004, 12h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo