알파벳 없이 문장 쓰기
July 20, 2019
Translated by readers into: English
(+!![] / +![] + [])[!+[] + !+[] + !+[]] +(+!![] / +![] + [])[+!+[]] +(![] + {})[+!+[] + [+[]]] +(!![] + [])[+!+[]] +(!![] + [])[!+[] + !+[] + !+[]] +([][[]] + [])[!+[] + !+[]] +(+!![] / +![] + [])[!+[] + !+[] + !+[]] +([] + {})[!+[] + !+[]] +(![] + [])[!+[] + !+[]] +(!![] + [])[!+[] + !+[] + !+[]]// -> 'incredible'
믿기 어렵겠지만, 위의 코드를 브라우저 개발자 콘솔에서 실행해보면 incredible
이 표시되는데, 이는 버그가 아니라 자바스크립트의 이상한(?) 특성들을 교묘하게 사용한 정상적인 코드이다.
저 이상한 코드는 자바스크립트의 형 변환, 덧셈 등을 이용하여 숨겨진 메시지를 표시한다.
이상한 자바스크립트 코드 생성기
아래 입력창에 메시지를 입력하면 특수문자만으로 작성된 이상한 자바스크립트 코드가 생성됩니다. 생성된 코드를 브라우저의 개발자 도구 또는 node.js REPL 환경에서 실행해보면 원본 메시지를 확인할 수 있습니다.
aladdin
· babel
· bts
· california
· fail
· incredible
· nodejs
· octocat
· r2d2
· san francisco
· seoul
· starcourt
· success
· sydney
· to infinity and beyond
· toy story 3
· yoda
(!![] + [])[+!![]] + // '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