Il existe au moins 5 façons de procéder:
Si vous souhaitez convertir uniquement en nombres entiers, un autre moyen rapide (et court) est le non double bit (c'est-à-dire en utilisant deux caractères tilde):
par exemple
~~x;
Référence: http://james.padolsey.com/cool-stuff/double-bitwise-not/
Les 5 méthodes courantes que je connais jusqu'à présent pour convertir une chaîne en un nombre ont toutes leurs différences (il y a plus d'opérateurs au niveau du bit qui fonctionnent, mais ils donnent tous le même résultat que ~~). Ce JSFiddle montre les différents résultats auxquels vous pouvez vous attendre dans la console de débogage: http://jsfiddle.net/TrueBlueAussie/j7x0q0e3/22/
var values = ["123",
undefined,
"not a number",
"123.45",
"1234 error",
"2147483648",
"4999999999"
];
for (var i = 0; i < values.length; i++){
var x = values[i];
console.log(x);
console.log(" Number(x) = " + Number(x));
console.log(" parseInt(x, 10) = " + parseInt(x, 10));
console.log(" parseFloat(x) = " + parseFloat(x));
console.log(" +x = " + +x);
console.log(" ~~x = " + ~~x);
}
Console de débogage:
123
Number(x) = 123
parseInt(x, 10) = 123
parseFloat(x) = 123
+x = 123
~~x = 123
undefined
Number(x) = NaN
parseInt(x, 10) = NaN
parseFloat(x) = NaN
+x = NaN
~~x = 0
null
Number(x) = 0
parseInt(x, 10) = NaN
parseFloat(x) = NaN
+x = 0
~~x = 0
"not a number"
Number(x) = NaN
parseInt(x, 10) = NaN
parseFloat(x) = NaN
+x = NaN
~~x = 0
123.45
Number(x) = 123.45
parseInt(x, 10) = 123
parseFloat(x) = 123.45
+x = 123.45
~~x = 123
1234 error
Number(x) = NaN
parseInt(x, 10) = 1234
parseFloat(x) = 1234
+x = NaN
~~x = 0
2147483648
Number(x) = 2147483648
parseInt(x, 10) = 2147483648
parseFloat(x) = 2147483648
+x = 2147483648
~~x = -2147483648
4999999999
Number(x) = 4999999999
parseInt(x, 10) = 4999999999
parseFloat(x) = 4999999999
+x = 4999999999
~~x = 705032703
La ~~xversion donne un nombre dans les cas «plus», où d'autres aboutissent souvent undefined, mais échoue pour une entrée non valide (par exemple, elle retournera 0si la chaîne contient des caractères non numériques après un nombre valide).
Débordement
Remarque: un dépassement d'entier et / ou une troncature de bits peuvent se produire avec ~~, mais pas avec les autres conversions. Bien qu'il soit inhabituel d'entrer des valeurs aussi importantes, vous devez en être conscient. Exemple mis à jour pour inclure des valeurs beaucoup plus grandes.
Certains tests Perf indiquent que le standard parseIntet les parseFloatfonctions sont en fait les options les plus rapides, probablement hautement optimisées par les navigateurs, mais tout dépend de vos besoins car toutes les options sont assez rapides : http://jsperf.com/best-of-string-to -nombre-conversion / 37
Tout dépend de la façon dont les tests de performance sont configurés, car certains montrent que parseInt / parseFloat est beaucoup plus lent.
Ma théorie est:
- Mensonges
- Darn lignes
- Statistiques
- Résultats JSPerf :)