2010-05-19 7 views
32

Je viens de creuser à travers un code JavaScript (Raphaël.js) et suis tombé sur la ligne suivante (traduit légèrement):Math.min.apply (0, tableau) - pourquoi?

Math.min.apply(0, x) 

x est un tableau. Pourquoi diable feriez-vous cela? Le comportement semble être "prendre le min du tableau x."

+0

Math.min.apply (ce, x) ferait aussi bien – kennebec

Répondre

31

J'ai réalisé la réponse que je posais ma propre question: Ce est la manière la plus succincte de prendre le min d'un tableau x en JavaScript. Le premier argument est totalement arbitraire; Je trouve le 0 déroutant parce que le code signifie intuitivement "Prenez le min de 0 et x", ce qui n'est absolument pas le cas. L'utilisation de l'objet Math a plus de sens pour la lisibilité humaine, mais les auteurs de Raphael.js sont obsédés par la minification et 0 est trois octets plus court.

Voir http://ejohn.org/blog/fast-javascript-maxmin/

Par souci de lisibilité, j'encourage vivement les gens à cesser de faire cela et définir la place d'une fonction le long des lignes de

function arrayMin(arr) { return Math.min.apply(Math, arr); }; 
+12

Il convient de noter que le « 0 » dans le code Raphaël représente la portée que Math.min est exécuté avec. La raison pour laquelle "devrait" être Math est parce que c'est la portée native/naturelle de cette méthode lorsqu'elle est invoquée normalement. L'utilisation de zéro est vraisemblablement équivalente à null, ce qui équivaut à l'objet global (fenêtre). Cela fonctionne bien en supposant que la méthode n'a pas besoin d'accéder à l'état interne de l'objet Math, ce qui est probablement une hypothèse sûre, mais c'est toujours une hypothèse. N'utilisez pas ce modèle vous-même si vous pouvez l'aider. Comme vous (Trevor) notez, utilisez Math là. –

+9

Correction à ce qui précède: Utiliser zéro ici n'est pas équivalent à null. Il est sémantiquement goofy, et il en résulte que la portée est un objet Number représentant zéro, ce qui est fondamentalement sans valeur. Cela réduit le nombre de caractères à un minimum, mais fait toujours une supposition sur le fonctionnement interne de "min". –

+1

Minification? Est-ce vraiment un mot? :) –

0

Voici un exemple où l'on peut obtenir le MAX et les décalages de fuseau horaire MIN pour l'année donnée pour un fuseau horaire. Il renvoie les deux modifications pour l'année pour tenir compte de DST et ST. (c'est-à-dire ST = 300 et DST = 360 pour le fuseau horaire en question).

var arr = []; 
    for (var i = 0; i < 365; i++) { 
     var d = new Date(); 
     d.setDate(i); 
     var newoffset = d.getTimezoneOffset(); 
     arr.push(newoffset); 
    } 
    var DST = Math.min.apply(null, arr); 
    var nonDST = Math.max.apply(null, arr); 
    tw.local.stInt = DST 
    tw.local.edInt = nonDST 
+0

Quelqu'un peut-il me dire la différence entre l'appel Math.min.apply (null, arr) et Math.min.apply (Math, arr). Comment le contexte d'appel nul fonctionnera-t-il avec apply? Le contexte natif pour la méthode min est l'objet Math et il est plus logique d'utiliser Math comme premier argument pour appliquer la méthode. – user1176058

3

La raison est la suivante:

  • Votre entrée x est un tableau

  • La signature de Math.min() ne prend pas des tableaux, que séparés par des virgules arguments

  • Si vous utilisiez Function.prototype.call() il aurait presque la même signature, sauf le premier argument est le this contexte, à savoir qui est "appeler"

    • Exemple: Math.min.call(context, num1, num2, num3)
  • Le context compte que lorsque vous faites référence à this dans la fonction, par exemple la plupart des méthodes que vous pouvez appeler sur un tableau: Array.prototype.<method> se référerait à this (le tableau à gauche du 'point') à l'intérieur de la méthode.

  • Function.prototype.apply() est très similaire à .call(), seulement au lieu de prendre des arguments séparés par des virgules, il faut maintenant un tableau après l'context.

    • Function.prototype.call(context, arg1, arg2, arg3)
    • Function.prototype.apply(context, [arg1, arg2, arg3])
  • Le 0 ou null que vous mettez comme premier argument est juste un levier de vitesses place.

Questions connexes