2013-04-23 26 views
8

Verilen aşağıdaki: Aşağıdaki tutan gerçek rağmenDizi haritası ve parseInt sıkıntılardan

[10, 0, 0, 1] 

:

> x = '10.0.0.1'.split('.'); 
["10", "0", "0", "1"] 

> x[1] == x[2] 
true 

Alternatif parseFloat kullanılarak

> '10.0.0.1'.split('.').map(parseInt) 
[10, NaN, 0, 1] 

yerine neden çıktı değil bana istenilen çıktıyı veriyor; Ancak burada önemli bir şeyi kaçırdığımı hissediyorum. Beklenildiği gibi çalışır.

EDIT:'10.0.0.1'.split('.').map(function(x) { return parseInt(x); }) beklendiği gibi çalışır.

EDIT2: Chrome Sürüm 26.0.1410.64 kullanıyorum, ancak bu aynı zamanda yerel düğüm node.j. Biri argüman (eleman geçer,) ile geri arama kullanımı yaygındır NaN

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map

açıklıyor "Zor Use Case" nde

+1

http://stackoverflow.com/questions/262427/javascript-arraymap-and-parseint http://stackoverflow.com/questions/8594699/map-parseint-strange-results –

cevap

10

bu bağlantının altındaki bak. Bazı işlevler de tek bir argüman ile yaygın olarak kullanılır. Bu alışkanlıklar kafa karıştırıcı davranışlara yol açabilir.

// Consider: 
["1", "2", "3"].map(parseInt); 
// While one could expect [1, 2, 3] 
// The actual result is [1, NaN, NaN] 

// parseInt is often used with one argument, but takes two. The second being the radix 
// To the callback function, Array.prototype.map passes 3 arguments: the element, the index, the array 
// The third argument is ignored by parseInt, but not the second one, hence the possible confusion. 
// See the blog post for more details 

// Solution: 
function returnInt(element){ 
    return parseInt(element,10); 
} 

["1", "2", "3"].map(returnInt); 
// Actual result is an array of numbers (as expected) [1, 2, 3] 
+0

1, için hız ve doğruluk! –

+0

Teşekkürler! Bunun gibi bir şey olacağını biliyordum, ama arama kriterlerinden emin değildim. – dcousens

+0

Harika cevap +1. Verdiğin örnek tam olarak beni güldürüyordu! Neden Chrome vs Firefox'ta farklı sonuçlar aldığımı merak ediyordum, ancak bu durum, radix tanımsız olduğunda davranışa uygulamaya bağımlı olduğu için. Şimdi Mozilla doktorunun "parseInt" kullanırken her zaman bir radix belirtmesini "neden daha geniş bir takdirim var – xlm