> xs.map(parseInt)
[10, NaN, 2]
Javascript is beautiful.
> xs.map(parseInt)
[10, NaN, 2]
Javascript is beautiful.
var mappableParseInt = function(str){
return parseInt(str, 10);
};
['10', '10', '10'].map(mappableParseInt);
I'd suspect this snippet is more a snipe at people who don't know JS very well and expect parseInt to be base-10 only.I dunno, as someone without much experience with Javascript, it is a little odd that arrays return the index alongside the value by default.
But it's WTF anyway. I have a function that takes either one or two arguments, I provide three, and everyone seems to be OK with that.
There's no way to know, even at run-time, whether a function is being called with too few or too many arguments, since that's equivalent to the halting problem. So the sensible alternative is just to default everything to undefined, and silently ignore extraneous arguments.
But yes, if JS was strict with how it handled argument definition lists and had support for indicating infinite arity, I'd agree, this would be a WTF, or at least strange. But I think it makes a lot of sense, all things considered.
Rather: remember three things that make up the majority of Array iterators' callback functions' signatures:
Element, Index, Array.
Shared by: .map, .every, .forEach, .filter, and probably some that I am forgetting. The exception I think is just .reduce[Right], which by definition requires its previous return value, so you have (retVal, elem, i, arr).
Quite literally, if you remember .map callback, you remember .every callback :)
Javascript deserves shtick for its truly bad parts (with, arguments, ...) and some missing parts, but .map and its friends aren't it.
The programmers are not the ones to blame on that.. this is really a bad contract between the language and the programmer
Its the equivalent of a function named "getStone()" to return you a " Paper{} " :)
It does.
> and entirely unreasonable to expect to be required to provide a base as anything except an optional argument
It is optional.
> and certainly it is unreasonable to expect that that second optional argument is treated as not optional in a composition operation
I don't understand what you're saying here. It's never treated as required, it's just map supplies a parameter in that position, so it get's used. That's how optional parameters work.
The wat (if there is one) is that map provides extra arguments.
> It does.
Not quite: in some browsers (IE), a string starting with '0' gets interpreted as octal. So parseInt('041') === 33 in IE.
Guess how I found out about that.
I think in this case it's not parseInt that's at fault, it's the fact that map optionally passes additional arguments.
>>> ['10', '10', '10'].map(x => parseInt(x, 10))
[10, 10, 10] xs = [
parseInt('10', 0),
parseInt('10', 1),
parseInt('10', 2)
]parseInt internally uses the ToInt32 abstract operation on the radix parameter. Once it has that value, it explicitly looks to see if the value is 0. If it is, it uses a radix of 10.
https://people.mozilla.org/~jorendorff/es6-draft.html#sec-pa...
Edit: I hope that doesn't come off as pedantic. My point wasn't to disagree as much as it was to just add some further explanation.
Try this:
int subtract(int b, int a) { return a - b; }
int test = subtract(5, 3); // != 2, just read the damn docs
Oh, C sucks now !
The talk is quite fun and interesting to watch though.
And the end is pretty cool.
The number one thing taught at user interaction / usabillity courses is that users don't read the documentation. Or skim it and go directly to one or two parts they want to check (Sure, some bizarro outliers do read it all).
Besides, a golden rule from the UNIX era is the "principle of least surprise". Don't define stupid behavior as default, as in this case (both for parseInt and Map).
Let's assume JavaScript is a poorly-designed language, and Clojure is a well-designed language. In the first month of language use, the user of Clojure will have looked at the docs many more times.
1) Clojure has a larger API -- Javascript doesn't have 1/10 that.
2) Javascript has a familiar (to many) Algol-derrived braced syntax and lots of common C/C++/Java/etc keywords. Clojure is only familiar to Lisp/Scheme users.
If those things were equal, Clojure would win the "don't have to look caveats up" contest, because its design is more coherent, and doesn't give you unexpected results and undefined behavior like Javascript does.
Obviously, you somehow you need to first know that "parseInt" is called "parseInt()" and not "atoi()" for example. But I wasn't implying never reading anything, including function reference. Just being able to code without needing to study and/or memorize lots of arcane edge cases.
And by "this is just stupid" do you mean "this === just stupid"?
If you think that's bad, you should see this!
xs.parseInt(Number)
Always. The moment you don't, all kinds of bugs follow.
I have to go cry now at the number of times this has bitten me.
function overValues(f) { return function(x) { return f(x); } }
Then you can do ['10', '10', '10'].map(overValues(parseInt));
However, usually you're going to want to do the equivalent of this ['0101', '032'].map(function(s) { return parseInt(s, 10); })
Because Javascript interprets a leading zero as an indicator of base.> as an indicator of base.
As an indicator of base 8 (octal).
['10', '10', '10'].map(Number);
var xs = ['10', '10', '10'];
xs.map(function (str) {
return parseInt(str, 10);
});
> [10, 10, 10]
Fixed that for you. Why? map callback params: (value, index, originalArray)
parseInt params: (string, radix)
Your code is passing the map array index to parseInt's radix.;)