Je me demande s'il existe des moyens non triviaux de trouver le signe des nombres ( fonction signum )?
Peut être des solutions plus courtes / plus rapides / plus élégantes que l'évidente
var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
Réponse courte!
Utilisez ceci et vous serez sûr et rapide (source: moz )
if (!Math.sign) Math.sign = function(x) { return ((x > 0) - (x < 0)) || +x; };
Vous voudrez peut-être examiner les performances et le violon de comparaison contraignant sur le type
Le temps a passé. De plus, c'est principalement pour des raisons historiques.
Résultats
Pour l'instant, nous avons ces solutions:
1. Évident et rapide
function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
1.1. Modification de kbec - un type cast moins, plus performant, plus court [plus rapide]
function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
mise en garde: sign("0") -> 1
2. Élégant, court, pas si rapide [le plus lent]
function sign(x) { return x && x / Math.abs(x); }
Mise en garde: sign(+-Infinity) -> NaN
,sign("0") -> NaN
À partir d' Infinity
un numéro légal dans JS, cette solution ne semble pas tout à fait correcte.
3. L'art ... mais très lent [le plus lent]
function sign(x) { return (x > 0) - (x < 0); }
4. Utilisation rapide du bit-shift
, maissign(-Infinity) -> 0
function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }
5. Type-safe [megafast]
! On dirait que les navigateurs (en particulier le v8 de chrome) font des optimisations magiques et cette solution s'avère beaucoup plus performante que d'autres, même que (1.1) malgré qu'elle contienne 2 opérations supplémentaires et ne peut logiquement jamais être plus rapide.
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
Outils
Les améliorations sont les bienvenues!
[Offtopic] Réponse acceptée
Andrey Tarantsov - +100 pour l'art, mais malheureusement, c'est environ 5 fois plus lent que l'approche évidente
Frédéric Hamidi - en quelque sorte la réponse la plus votée (pour le moment) et c'est plutôt cool, mais ce n'est certainement pas la façon dont les choses devraient être faites, à mon humble avis. De plus, il ne gère pas correctement les nombres Infinity, qui sont aussi des nombres, vous savez.
kbec - est une amélioration de la solution évidente. Pas si révolutionnaire, mais dans l'ensemble, je considère que cette approche est la meilleure. Votez pour lui :)
test everything
version, Safe refusera de tester les valeurs spéciales, donc ce sera plus rapide! Essayez only integers
plutôt d' exécuter le test. De plus, JSPerf fait juste son travail, il ne s'agit pas de l'aimer. :)
typeof x === "number"
met un peu de magie sur performace. S'il vous plaît, faites plus de courses, en particulier FF, Opera et IE pour que ce soit clair.
Math.sign()
(0 === 0, pas aussi rapide que "Safe") qui est apparu dans FF25 et est à venir dans Chrome.
0
est un cas particulier