This works fine:
["655971", "2343", "343"].map(function(x) { return parseInt(x) }) // [655971, 2343, 343]开发者_运维问答
But this doesnt:
["655971", "2343", "343"].map(parseInt) // [655971, NaN, NaN]
The same happens for Array.filter()
What am I missing here?
It's because map
passes more arguments than just the array item into the callback function. You get:
callback(item, index, array)
Normally your function would just ignore the arguments it didn't need. But parseInt
accepts an optional second parameter:
parseInt(string, base)
for the first call, base
is the index
0
. That works okay because ECMAScript defines that base=0
is the same as omitting the argument, and consequently allows decimal, octal or hex (using decimal in this case).
For the second and third items, base
is 1
or 2
. It tries to parse the number as base-1 (which doesn't exist) or base-2 (binary). Since the first number in the string is a digit that doesn't exist in those bases, you get a NaN
.
In general, parseInt
without a base is pretty questionable anyway, so you probably want:
["655971", "2343", "343"].map(function(x) { return parseInt(x, 10) })
The problem is that map
expects that the callback should be a function that accepts three arguments, callbackfn(value, index, array)
.
The second argument is clashing with the radix
argument of the parseInt(string, radix)
function.
Map calls parseInt like this for each element:
parseInt("655971",0); // 655971
parseInt("2343", 1); // NaN
parseInt("343", 2); // NaN
The first one works because if radix is undefined or 0, it is assumed to be 10.
Array.Filter takes a function that returns information whether or not the item to evaluated satisfies the condition. IsNumeric will work for what you want.
http://www.hunlock.com/blogs/Mastering_Javascript_Arrays
精彩评论