JS Quiz

May 14, 2024

원래 주제는 다른 글 이지만, 본론을 올리기 전 간단하게 JS Quiz 를 보며
refresh 를 해보자.

Quiz.1

console.log(018 - 015)

해당 console.log 의 output 을 어떤값일까?

  1. NaN
  2. 3
  3. 5
  4. 13

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Quiz 1 해설

다양한 생각이 있겠지만 JS 에서는 앞에 0이 붙으면 Oct(8진수) 로 계산이 된다.
8진수는 각자리에서 8의 거듭제곱을 곱하고, 그 결과를 다 더해야 한다.

이제 각 값을 10진수로 변환하면?

  • 018 은 8진수로 나타낼수 없다. 8진수는 0~7로만 이루어져 있다.
    결국 018 은 10진수 18이 된다.
  • 015 는 8진수로 변환시 각 자리에 8의 거듭제곱을 곱한 뒤 더하면 0 + 8 + 5 = 13 이 된다.

그럼 각 결과를 더하면 18 - 13, 즉 정답은 5가 된다.
답은 3번이다.

js 에서 strict mode 일때는 0을 붙였을시 표기 오류가 난다.
그때는 0o를 붙여 8진수를 표현 할수 있다.

Quiz. 2

console.log(typeof typeof 1)

해당 console.log 의 output 을 어떤값일까?

  1. string
  2. number
  3. 1
  4. true

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Quiz 2 해설

이 어느정도 JS 를 해봤다면 아주 쉬울 것이다.
JS 의 typeof 는 주어진 변수의 데이터 타입을 string 형식으로 반환하게 된다.

그럼 해당 문제를 하나씩 뜯어보면 typeof 1"number" 가 나오게 되고
typeof "number""string" 이 된다.

답은 1번 이다.

Quiz. 3

const numbers = [33, 2, 8] numbers.sort() console.log(numbers[1])

해당 console.log 의 output 을 어떤값일까?

  1. 33
  2. 2
  3. 8
  4. 1

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Quiz 3 해설

이 문제를 못 맞춘다면…
Js를 다뤄봤다면 아주 쉬운 문제이다.

정답은 1번 이다.
해설은 따로 없다.

Js 에서 sort 는 요소들을 문자열로 변경하여 정렬한다.

Quiz. 4

console.log(false == "0")

해당 console.log 의 output 을 어떤값일까?

  1. false
  2. true

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Quiz 4 해설

여기는 약간 헷갈릴수 있다.
===== 의 차이를 생각하고 진행사항을 보자.

== 는 값을 비교할때 자동으로 두 값의 형변환을 진행하게 된다.
Number(false) 는 0 으로 변환되어 0 == "0" 이 된다.
여기서 "0" 은 다시 형변환 되어 Number("0") 즉 0 이 된다.

결론적으로 0 == 0이 되므로 결과값은 true 로 나오게 된다.
답은 2번 이다.

만약 === 으로 비교한다면 값과 함께 유형검사도 하기 때문에 false 가 나온다.

Quiz. 5

console.log(0.1 + 0.2 == 0.3)

해당 console.log 의 output 을 어떤값일까?

  1. false
  2. true

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Quiz 5 해설

이건 유명한 문제이며 원인은 부동소수점 숫자를 표현하는 데 IEEE 754 표준을 사용하기 때문이다.
JS만 그렇지 않고 많은 언어들이 이를 따르고 있다.
이 표준은 실수를 2진수로 정확히 표현하지 못하기 때문에 최대한 그에 근접한 값으로 변환하여 사용한다.

그래서 0.1 + 0.2 는 0.3 이 아니고 (ex 0.30000000000004) 약간의 차이가 생기게 된다.
하여 정답은 1번 이다.

JS 에서 이런 부분을 막기 위한 방법 중 한나로 Number.EPSILON을 활용하는 방법이 있다.
Number.EPSILON 은 2의 -52승 의 값을 나타낸다. 해당 공식의 결과가 EPSILON 보다 작다면 이는 true 로 볼 수 있다.

Quiz. 6

let array = [1, 2, 3] array[6] = 9 console.log(array[5])

해당 console.log 의 output 을 어떤값일까?

  1. 1
  2. 2
  3. 9
  4. undefined

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Quiz 6 해설

Js 에서 Array의 length 를 벗어나는 position 에 값을 할당할 경우
Js 는 자동으로 빈부분을 채우게 된다.
당연히 값이 없으니 undefined 로 채워지게 되고
답은 4번 이 된다.

Quiz. 7

const isTrue = true == [] const isFalse = true == ![] console.log(isTrue + isFalse)

해당 console.log 의 output 을 어떤값일까?

  1. 1
  2. 0
  3. "true"
  4. true

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Quiz. 7 해설

const isTrue 를 살펴보면
빈배열은 형변환이 되며 ”[]” 이건 "" 이렇게 빈문자열로 변환된다.
그리고 true 역시 형변환이 되며 true 는 숫자 1 이 된다.

이제 1 == "" 이런식으로 되었는데 빈문자열은 false, 즉 형변환을 하게 되면 숫자 0이 된다.
결국 1 == 0 이 되므로 isTrue 의 값은 false 이다.

const isFalse 를 살펴보면
![] 이부분은 Js 에서 기본적으로 빈배열은 truthy 값으로 평가 되기 때문에
true 를 ! 로 논리 부정을 적용하면 false 가 된다.

false 는 형변환으로 숫자 0이 되고,
true 는 위와 같이 숫자 1로 변환되기 때문에 결국 1 == 0 이 되고
값은 false가 된다.

결국 isTrue 도 false 고 isFalse 도 false 가 되고, isTrue + isFalse 는 false + false 가 되고 형변환이 이뤄지면
0 + 0 즉 결과는 0이 나오게 된다.

정답은 2번

Quiz. 8

console.log(1 + "2" + "2")

해당 console.log 의 output 을 어떤값일까?

  1. 122
  2. 32
  3. NaN2
  4. NaN

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Quiz. 8 해설

Js 에서 ”+” operator 는 왼쪽에서 오른쪽으로 형변환을 시도하게 된다.
1 + “2” 라는 건 “2” 의 타입이 string 이기 때문에 1은 “1” 로 변환되고
결국 “1” + “2” 는 “12” 가 된다.

여기서 “12” + “2” 를 하게 되면 string 을 그대로 합치기 떄문에
“122” 가 결과로 나오게 된다.

정답은 1번 이다.

Quiz. 9

console.log(String.raw`HelloTwitter\nworld`)

해당 console.log 의 output 을 어떤값일까?

  1. "HelloTwitter\nworld"
  2. "HelloTwitter world"
  3. "HelloTwitter world"
  4. "Hello Twitter world"

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Quiz. 9 해설

String.raw 는 문자열 내부 이스케이프 시퀀스를 무시하고 원시 문자열 데이터를
그대로 반환하게 된다.

여기서 ‘\n’ 은 원래라면 new line 으로 해석되어야 하지만 String.raw 로 인해
그대로 출력되어 정답은 HelloTwitter\nworld 그대로 값이 나오게 된다.

답은 1번 이다.

Quiz. 10

console.log("This is a string." instanceof String)

해당 console.log 의 output 을 어떤값일까?

  1. true
  2. false

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Quiz. 10 해설

instanceof 는 주어진 객체가 특정 클래스 또는 생성자의 인스턴스 인지 확인한다.
해당 객체의 prototype 체인을 거슬러 올라가서 확인하기 떄문에
“This is a string” 의 생성자를 생각해보자.

String 객체일가? 과연
“This is a string” 의 타입을 생각해보자. 원시타입 string 이다.
원시타입 string 은 String 객체에 의해 생성되지 않았기 때문에
결과값은 false 가 나온다.

정답은 2번 이다.

여기서 true 가 나오려면 new String("This is a string.") 이 되어야 한다.

오늘 준비한건 여기까지, 크게 중요치 않지만
그냥 갑자기 보여서 오랜만에 퀴즈를 풀어봤다.