This is because if a number starts with a ‘0’, it’s treated as base 8 (octal).
You can force the base by passing the base as the 2nd parameter.
parseInt("09", 10) // 9
According to the docs, the 2nd parameter is optional, but it’s not always assumed to be 10, as you can see from your example.