Потому что JavaScript не реализует правильную кодировку Unicode (которая обращается к 1114112 кодовым точкам), но UCS-2 (которая обращается только к 65536). Так называемые астральные символы кодируются в JavaScript как два символа UCS-2; ваш charCodeAt(0)
показывает только первый из них.
В JavaScript есть новая функция, которая исправляет это:
console.log("?".codePointAt(0))
MDN имеет polyfill , где вы можете изучить математику за переводом.