49 votes

Code étrange dans les sources jQuery: var! == var? x: y;

Récemment, j'ai trouvé une ligne étrange dans les sources de jQuery (dernière version 1.9.1, paquetage Sizzle, ligne 129 funescape fonction):

 funescape = function( _, escaped ) {
    var high = "0x" + escaped - 0x10000;
    // NaN means non-codepoint
    return high !== high ?            // <--- LINE 129
        escaped :
        // BMP codepoint
        high < 0 ?
            String.fromCharCode( high + 0x10000 ) :
            // Supplemental Plane codepoint (surrogate pair)
            String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
};
 

Quelle est la raison de faire une comparaison high !== high ? Il semble évident que return escaped ne sera jamais exécuté. Ou est-ce que quelque chose me manque?

Référence: https://github.com/jquery/sizzle/blob/master/sizzle.js#L129

59voto

koopajah Points 5165

En fait, c'est écrit dans le commentaire juste au-dessus:

// NaN moyens non-codepoint

Donc, il est obligatoire d'effectuer cette comparaison, d'abord pour gérer l' NaN cas comme dans l'JavaScript:

NaN === NaN retours false.

Comme l'a souligné James Wiseman il est également important de savoir pourquoi le développeur a utilisé high !== high au lieu de isNaN(high) qui aurait été plus clair.

Il est certainement basée sur la performance. Ce test montre que l' a !== a est vingt fois plus rapide que l' isNaN(a).

zzzzBov indique également que, isNaN() peut être remplacée, à l'aide de !== est aussi plus portable.

Plus d'infos à partir de Benjamin Gruenbaum:

Il est également intéressant de noter que NaN n'est pas égal à tout autre chose aussi eh bien, et aussi il n'est pas égal à tout autre chose dans un sens unstrict

Et à partir de Jan Dvorak:

Notez également {valueOf:function(){return{}}} ne l'égalité elle-même

13voto

Jose Rui Santos Points 5381

La condition high !== high renvoie la valeur true, quand le haut est - NaN.Je me demande pourquoi le jQuery gars n'a pas utilisé le très claires isNaN(high) de la fonction à la place, mais c'est probablement dû à des raisons de performances comme koopajah souligné.

NaN (Not-a-Nterre d'ombre) signifie un résultat qui ne peut pas être représenté comme un Number. C'est un undeterminated nombre.


Pourquoi NaN === NaN renvoie false ?

Envisager

0/0          = NaN
Math.asin(2) = NaN

Vous savez qu' 0/0 est différent de celui d' Math.asin(2), alors pourquoi devrait NaN être égal à NaN?

6voto

James Wiseman Points 18347

Je suis piggy-backing sur certains des commentaires ici, mais pensez à ce digne d'informations.

Quelques commentaires sur la question d'origine ont suggéré que cette méthode de vérification de NaN est en fait beaucoup plus rapide que l' isNaN()

Lorsqu'ils sont pris conjointement avec les documents suivants alternative à l' parseInt parseFloat , nous avons un moyen très rapide de la conversion d'un nombre et de la vérification de son numérique de l'état.

Est Moins Zéro une sorte de performances JavaScript truc?

Ainsi, au lieu de

function Translated(val) {
    var x = parseFloat(val);
    if (!isNaN(x)) {
        alert("Not a number");
    }
}

Nous pouvons avoir

function WTF(val) {
    var x = val - 0;
    if (x !== x) {
        alert("Not a number");
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X