아빠는 개발자

알파벳 없이 문장 쓰기

July 20, 2019

Translated by readers into: English

(+!![] / +![] + [])[!+[] + !+[] + !+[]] +
(+!![] / +![] + [])[+!+[]] +
(![] + {})[+!+[] + [+[]]] +
(!![] + [])[+!+[]] +
(!![] + [])[!+[] + !+[] + !+[]] +
([][[]] + [])[!+[] + !+[]] +
(+!![] / +![] + [])[!+[] + !+[] + !+[]] +
([] + {})[!+[] + !+[]] +
(![] + [])[!+[] + !+[]] +
(!![] + [])[!+[] + !+[] + !+[]]
// -> 'incredible'

믿기 어렵겠지만, 위의 코드를 브라우저 개발자 콘솔에서 실행해보면 incredible 이 표시되는데, 이는 버그가 아니라 자바스크립트의 이상한(?) 특성들을 교묘하게 사용한 정상적인 코드이다.

저 이상한 코드는 자바스크립트의 형 변환, 덧셈 등을 이용하여 숨겨진 메시지를 표시한다.


이상한 자바스크립트 코드 생성기

아래 입력창에 메시지를 입력하면 특수문자만으로 작성된 이상한 자바스크립트 코드가 생성됩니다. 생성된 코드를 브라우저의 개발자 도구 또는 node.js REPL 환경에서 실행해보면 원본 메시지를 확인할 수 있습니다.

(!![] + [])[+!![]] + // 'r' == 'true'[1]
(!+[] + !![]) + // '2'
([][[]] + [])[!+[] + !![]] + // 'd' == 'undefined'[2]
(!+[] + !![]) // '2'
// -> 'r2d2'

숫자 · 영문자 이외의 문자, 그리고 다음 알파벳은 변환되지 않습니다.

g h k m p q v w x z

간단한 설명

줄바꿈 처리된 결과 코드의 각 라인에는 일정한 패턴이 보입니다.

([]+{})[!+[]+!+[]] == ( []+{} )[ !+[]+!+[] ] // 'b'
([]+{})[+!+[]] == ( []+{} )[ +!+[] ] // 'o'
(+{}+[])[+!+[]] == ( +{}+[] )[ +!+[] ] // 'a'
(!![]+[])[+[]] == ( !![]+[] )[ +[] ] // 't'
// ( string )[ n ]

위와 같은 방법으로 임의의 문자열에서 n 번째 인덱스의 문자를 가져올 수 있고, 재료(?)가 되는 문자열과 숫자는 아래의 방법으로 얻어서 사용할 수 있습니다.

+![] // 0
+!![] // 1
!![] // true
![] // false
[][[]] // undefined
+!![] / +![] // Infinity
[] + {} // "[object Object]"
+{} // NaN

이 포스트는 What the f*ck JavaScript? 에서 영감을 얻었습니다.

변환의 원리는 위 글에서 자세하게 설명하고 있으며, 코드 생성기 결과의 설명 주석을 참고하시면 더 쉽게 이해할 수 있습니다.


다음 글: 알파벳 없이 문장 쓰기 - 파트 2

Edit on GitHub


개발자를 꿈꾸는 아들을 둔 아빠 개발자입니다.
데이터 시각화에 관심이 있으며, 재미있는 프로그램을 만드는 것을 좋아합니다.