나는 특이한 문제를 좋아하는 편이다. 오늘은 최근에 본 특이한 문제를 소개 한번 해보도록 하겠다.
x !== x
const x = ?
if ( x !== x ) {
console.log('Hello, world!')
}
x를 정의해서 'Hello, world!'를 출력 할 수 있을까? !==는 불일치 연산자이다. 값과 타입을 다른지 판별을 한다. 그런데 x가 x가 아니게 만들라니 참 특이한 문제이다.
== 왜 쓰지 말라는 걸까? 물론 위의 문제를 해당 포스트에서 제기하였다. ===(일치연산자)는 만능이 아니다.
x = NaN 이게 된다면, x !== x의 값이 참이되게 된다.
x === x + 1
const x = ?
if ( x === x + 1 ) {
console.log('Hello, world!')
}
이 문제는 무엇일까? === 일치연산자인데 x와 x + 1이 현실에서 똑같을리 없다. 뭐 물론 x < x + 1 이 값이 참이 되는 경우는 C언어를 공부하다보면 알게 되었을 것이다. 뭐 그렇다 오버플로우이다.
자바스크립트에서 허용 되는 가장 큰값 Number.MAX_SAFE_INTEGER(9007199254740991)에 1을 더하면 어떻게 될까? 자바스크립트에서는 그냥 더해질 뿐이다. (9007199254740992)
그렇다면 Number.MAX_SAFE_INTEGER(9007199254740991)에 2를 더하면 어떻게 될까? 결과는 9007199254740992 우리가 계산으로 컴퓨터를 이겼다.
당연히 우리는 9007199254740993인 것을 알고있다.
뭐 내용을 따져보면 IEEE-754(부동소수점 어쩌고저쩌고) Number.MAX_SAFE_INTEGER의 이상의 값에서는 반올림을 하기 때문이라고 한다.
즉, x = Number.MAX_SAFE_INTEGER + 1이면 된다.
x == 1 && x == 2 && x == 3
const x = ?
if ( x == 1 && x == 2 && x == 3 ) {
console.log('Hello, world!')
}
자 이번엔 더 특이한 값이다. 그래도 이번에는 일치연산자가 아닌 동등연산자이다.
new Date() - new Date() (javaScript 형변환) 해당 글에서 Date객체가 숫자형으로 변환이 어떻게 되는지에 대해서 포스팅 해보았다. 해당 글에서 Symbol.toPrimitive속성이 함수인것까지 알아보았다.
즉 위의 비교 문장에서 비교 될때마다 [Symbol.toPrimitive] 메서드가 실행된다!
당연한게도 x() == 1 && x() == 2 && x() == 3 이게 참이 되게 만드는 것은 누워서 떡먹기 보다 쉽다.
const x = {
value: 1,
[Symbol.toPrimitive]: function (hint) {
return this.value++
}
}
if ( x == 1 && x == 2 && x == 3 ) {
console.log('Hello, world!')
}
문제 출처
https://javascript.plainenglish.io/interviewer-can-x-x-return-true-in-javascript-7e1d1fa7b5cd
뭐 물론 이 문제들을 풀수 없다고 해서 프로그래밍을 못한다? 이런식으로 말할 수도 없고, 이 문제를 풀었다고 해서 잘하는 사람이다. 이런식으로 평가를 할 수 없다는 것은 이 글을 보고 있는 분도 동감 할 것이다. 게다가 위의 트릭들을 실제 프로젝트에서 쓴다? 이것은 알아보기 힘든 닌자코드라는 것도 인정해야한다. 제발 쓰지 말아라.
뭐 그래도 이런 문제 알고 있으면 동료 개발자에게 재밌는 퀴즈 같은 것을 낼 수 있으니, 나는 이런 부류의 코드를 매우 좋아한다.
댓글
댓글 쓰기