Function.length will return the number of arguments a function is expecting.
The spread operator will not be included in the count.
when you call
Array.map(func), the mapped function gets called with 3 arguments, not just the value.
["10", "11", "12"].map(parseInt);
You’d expect to get
[10, 11, 12];
but in reality get
[10, NaN, 1];
This is because
.map(parseInt) calls the function with three arguments -
(currentValue, index, array). This is normally not an issue, but becomes an issue when the mapped function takes additional arguments that do not correspond to the ones being passed in.
parseInt takes in two arguments -
value, [, radix], and thus tries to parse
11 with radix
1, which is
Values are truth-y by default
The only falsey values are:
[0, -0, 0n, "", "", null, undefined, NaN, false];
Everything else is truthy - including
, an empty Set(), and an empty object.
Null comparisons to 0
I ran into a nasty bug once where a value I thought was guaranteed to be a number was actually explicitly set to null. I was doing a comparison with
0 and ran into this weird behavior:
Array.sort sorts by string sequence code
.sort() on an array of numbers will not sort them numerically. Which is perplexing
Null is not equal to zero, and is not greater than zero, but is greater than or equal to zero.
String.replace() only replaces the first instance of a match
String.replace only replaces the first instance of a match in a string.
Thankfully in ES2021 we now have
String.replaceAll, which behaves as you’d expect.