Ответ 1
A 'char' в терминах JS - фактически код кода UTF-16, а не полный символ Юникода. (Это печальное положение вещей происходит с древних времен, когда не было никакой разницы *.) Чтобы использовать символ за пределами базовой многоязычной плоскости, вы должны записать его в кодированной UTF-16 форме суррогатная пара двух 16-разрядных кодовых блоков:
String.fromCharCode(0xD83D, 0xDE04)
В ECMAScript 6 мы получим некоторые интерфейсы, которые позволят нам иметь дело со строками, как если бы они были полными кодовыми точками Юникода, хотя они неполны и являются лишь фасад над типом String, который все еще сохраняется как последовательность кода кода. Тогда мы сможем сделать:
String.fromCodePoint(0x1F604)
Смотрите этот вопрос для некоторого кода polyfill, чтобы вы могли использовать эту функцию в современных браузерах.
(*: Когда я получаю доступ к машине времени, я оставляю Гитлера в покое и возвращаюсь, чтобы изобрести UTF-8 раньше. UTF-16 никогда не было!)