Bunu yapmanın en az 5 yolu vardır:
Yalnızca tamsayılara dönüştürmek istiyorsanız, başka bir hızlı (ve kısa) yol, çift bitli değil (yani iki tilde karakteri kullanmaktır):
Örneğin
~~x;
Referans: http://james.padolsey.com/cool-stuff/double-bitwise-not/
Bir dizeyi bir sayıya dönüştürmenin şu ana kadar bildiğim 5 yaygın yolunun hepsinin farklılıkları vardır (çalışan daha fazla bitsel işleç vardır, ancak hepsi aynı sonucu verir ~~). Bu JSFiddle, hata ayıklama konsolunda bekleyebileceğiniz farklı sonuçları gösterir: 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);
}
Hata ayıklama konsolu:
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
~~xVersiyon diğerleri genellikle neden "daha" durumlarda, bir dizi sonuçları undefined, ancak geçersiz giriş için başarısız (örneğin o dönecektir 0dize olmayan sayı karakterler içeriyorsa sonra geçerli bir sayı).
taşma
Lütfen dikkat: Tamsayı taşması ve / veya bit kesilmesi ~~, diğer dönüştürmelerle birlikte meydana gelebilir , ancak bu gerçekleşmeyebilir. Bu kadar büyük değerler girmek alışılmadık bir durum olsa da, bunun farkında olmanız gerekir. Örnek, çok daha büyük değerler içerecek şekilde güncellendi.
Bazı Perf testleri, standart parseIntve parseFloatişlevlerin aslında en hızlı seçenekler olduğunu ve muhtemelen tarayıcılar tarafından yüksek oranda optimize edildiğini gösteriyor, ancak tüm seçenekler yeterince hızlı olduğu için bunların tümü sizin gereksiniminize bağlı : http://jsperf.com/best-of-string-to -sayısı dönüşüm / 37
Bazıları parseInt / parseFloat'ı çok daha yavaş olacak şekilde gösterdiğinden, bu tamamen perf testlerin nasıl yapılandırıldığına bağlıdır.
Benim teorim:
- Yalanlar
- Darn hatları
- İstatistik
- JSPerf sonuçları :)