hex

(65).toString(16)    // 41
"A".charCodeAt().toString(16) // 41

code to char

String.fromCharCode(0x41)    // "A"


JS는 유니코드가 16bit charset이었을 때 개발되었기 때문에 JS에서 한 문자는 기본적으로 2 bytes 유니코드다.

그러나 `` \x??``로 직접 입력하는 경우 1 byte 씩 문자로 인식한다. 2 bytes 유니코드 문자를 사용하려면 `` \u``를 사용해야 한다.
```js

"\uc548"

"안"

"\xc5\x48"

"ÅH"

```


BMP를 넘어가는 경우(U+10000 이상) surrogate halves가 총 4 bytes이므로 ``length``를 2로 인식한다.
그래서 UTF-16이라기 보다는 UCS-2에 가까우나 이를 한 문자로 표시하기 때문에 완전히 UCS-2같지는 않다.

```js

"A" === "\u0041"


"\uD834\uDC06"         //  "𝀆"  BMP를 넘어가는 경우.
"\uD834\uDC06".length  // 2  한 문자지만 length는 2다.

String.fromCharCode(65586)  // "2"
String.fromCharCode(65586).charCodeAt()  // 50
String.fromCharCode(50)     // "2"
// 65536(0x10000) 부터 쪼개지는게 아니라 다시 0으로 되돌아간다.

```


유니코드 공백 문자 집합

```js
\s == [\f\n\r\t\u000B\u0020\u00A0\u2028\u2029]
```


JS unpacking

eval부터 끝까지 복사한다음, 

브라우저 개발자 도구에서 console탭에 붙여넣기하고

eval을 ``js console.log()`` 또는 ``js alert()``로 바꾼다.


eval()

``js setTimeout(), setinterval()``은 함수 인수를 취하지만, ``js eval()`` 처럼 문자열을 받아 실행할 수도 있다.
그러나 문자열 인수를 넘기는 것은 보안, 성능상 좋지 않다.