parseInt("") is NaN because the standard says so, even if +"" is 0 instead (also just because the standard says so, meaning, for example, that "" == 0 ).
Do not look at the logic in this, because there is no deep deep logic, just history .
You, in my opinion, are making a BIG mistake ... the sooner you fix it, the better it will be for your life to program using Javascript. The mistake is that you assume that every choice made in programming languages and every technical information about them is logical. This is simply not true.
Especially for Javascript.
Please remember that Javascript was “designed” in a hurry and, simply because of fate, it became extremely popular overnight. This forced the community to standardize it before a serious thought about the details, and therefore it was basically “frozen” in its current sad state before serious field trials.
There are things that are so bad that they aren’t even funny (for example, the with operator or the equality operator == , which is so broken that serious js-IDE warn about using any : you get things like A==B , B==C and A!=C , even using only ordinary values and without any "special" value , for example null , undefined , NaN or empty lines "" and not because of precision tasks).
Honest special cases are everywhere in Javascript, and trying to put them in a logical frame is, unfortunately, wasted. Just study its oddities, read a lot and enjoy the fantastic runtime environment it provides (this is where Javascript really shines ... browsers and their JITs are truly an impressive piece of technology: you can write a few lines and get really useful software on a gajillion different computing devices).
The official standard, which lists all the oddities, is quite difficult to read, because it is very accurate, and, unfortunately, the rules that it must indicate are really complex.
Moreover, as the language gets more features, the rules will become more and more complex: for example, for ES5, just another strange “special” case (for example, ToPrimitive behavior for Date objects) becomes the “normal” case in ES6 (where ToPrimitive can be customized).
Not sure if this “normalization” is something to be happy about ... the real problem is the frozen starting point, and there are no easy solutions right now (if you don't want to throw away all existing javascript code, that is).
The normal path for the language begins clean and pleasant, symmetrical and small. Then, when confronted with real-world problems, the language receives (gets infected) some ugly parts (because the world is ugly and asymmetric).
Javascript is like that. Besides the fact that he did not become pleasant and clean, and, in addition, there was no time to polish him before throwing him into the game.