Follow the callback contract
The output is [1, NaN, NaN]. The surprising part is not how map iterates; it is the mismatch between the arguments map supplies and the arguments parseInt accepts. For every element, map invokes its callback with three values: the current element, its index, and the original array. Passing parseInt directly therefore behaves like calling parseInt(element, index, values).
parseInt uses its first argument as the string to parse and its second argument as the radix. It ignores the third array argument, but the index is significant. At index 0, radix 0 lets JavaScript infer a valid base and '1' becomes 1. At index 1, radix 1 is invalid, so the result is NaN. At index 2, binary is a valid radix, but '3' is not a valid binary digit, so that result is also NaN.