JS Is Weird 퀴즈 정리

junsangyu·2021년 12월 15일
8
post-thumbnail

https://jsisweird.com
자바스크립트의 이상한 문법을 퀴즈로 풀어보았다. 25문제중에 14문제밖에 못맞췄다...
이래서는 자바스크립트 한다고 하면 안될거 같아서 퀴즈들을 정리해 보았다.

1. true + false

정답: 1

+ 연산에서 Boolean 값은 Number로 형변환한다.


true + false
Number(true) + Number(false)
1 + 0
1

2. [,,,].length

정답: 3

마지막 comma는 trailing comma이고, 나머지 3개의 공간에는 자동으로 undefined가 들어간다.

[,,,]
[undefined, undefined, undefined,]
[undefined, undefined, undefined]

3. [1, 2, 3] + [4, 5, 6]

정답: 1,2,34,5,6

객체 [1, 2, 3].toString()으로 형변환하면 문자열 '1, 2, 3'으로 변한다.

[1, 2, 3] + [4, 5, 6]
[1, 2, 3].toString() + [4, 5, 6].toString()
'1, 2, 3' + '4, 5, 6'
'1, 2, 34, 5, 6'

4. 0.2 + 0.1 === 0.3

정답: false

부동소수점 문제로 정확한 값이 나오지 않는다.

0.2 + 0.1
0.30000000000000004

5. 10,2

정답: 2

쉼표 연산자는 마지막 값을 반환한다.

6. !!""

정답: false

! 연산자는 값을 Boolean형으로 형변환 시키고 not을 취하는 연산자이다.

!!""
!!Boolean("")
!!false
!true
false

7. +!![]

정답: 1

단항 + 연산자는 값을 Number형으로 형변환 시킨다.

+!![]
+!!Boolean([])
+!!true
+!false
+true
1

8. !!!true

정답: false

!!!true
!!false
!true
false

9. true == "true"

정답: false

Abstract Equality Comparison 연산자 == 는 비교할때 Number로 형변환된다.

===는 false니까 당연히 == 는 true인줄 알았다 ㄷㄷ

true == "true"
Number(true) == Number("true")
1 == NaN
false

10. 010 - 03

정답: 5

숫자 앞에 0이 붙으면 8진수로 표현된다. 0b는 2진수, 0x는 16진수이다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Numbers_and_dates#octal_numbers

010 - 03
8 - 3
5

11. "" - - ""

정답: 0

- 연산에서 문자열은 Number로 형변환되고, 오른쪽 - 연산자는 -0 으로 바뀐다. - - 대신 --로 붙이면 SyntaxError 가 난다

"" - - ""
Number("") - - Number("")
0 - - 0
0 - -0
0 - 0
0

12. null + 0

정답: 0

+ 연산에서 null 은 Number로 형변환된다.

null + 0
Number(null) + 0
0 + 0
0

13. 0/0

정답: NaN

그냥 0/0은 NaN이다.

14. 1/0 > 10 ** 1000

정답: false

자바스크립트에서 1/0은 Infinity이고, 10 * 1000도 Infinity이다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Infinity

1/0 > 10 ** 1000
Infinity > Infinity
false

15. true++

정답: SyntaxError

변수가 아닌곳에 ++ 연산자는 SyntaxError가 난다.

true++; // SyntaxError
1++; // SyntaxError
"x"++; // SyntaxError
null++; // SyntaxError
undefined++; // NaN
NaN++; // NaN

let _true = true;
_true++;
_true; // 2

16. "" - 1

정답: -1

- 연산자는 문자열을 Number로 형변환한다. 이때 + 연산자는 문자열을 합치는 기능이 있지만 - 연산자는 그런 기능이 없다.

"" - 1
Number("") - 1
0 - 1
-1

// + 연산자는?
"" + 1
"" + "1"
"1"

17. (null - 0) + "0"

정답: "00"

(null - 0) + "0"
(Number(null) - 0) + "0")
(0 - 0) + "0"
0 + "0"
"00"

18. true + ("true" - 0)

정답: NaN

true + ("true" - 0)
true + (Number("true") - 0)
true + (NaN - 0)
true + NaN
NaN

19. !5 + !5

정답: 0

!5 + !5
!true + !true
false + false
0 + 0
0

20. [] + []

정답: ""

[] + []
[].toString() + [].toString()
"" + ""
""

21. 1 + 2 + "3"

정답: "33"

1 + 2 + "3"
3 + "3"
"33"

22. typeof NaN

정답: "number"

NaN은 Number 형이다.
number value that is a IEEE 754 “Not-a-Number” value

23. undefined + false

정답: "NaN"

undefined를 Number로 형변환하면 NaN이다.

Number(undefined) + Number(false)
NaN + 0
NaN

24. "" && -0

정답: ""

&& 연산자는 첫번째 값이 거짓이면 첫번째 값을 반환하고, 그외의 경우에는 두번째 값을 반환한다. 문제의 경우에는 첫번째 값이 거짓이므로 첫번째 값이 반환된다.

"" && -0
""

25. +!!NaN * "" - - [,]

정답: 0

+!!NaN은 0이고, Number("")도 0이다. [,]은 trailing comma이므로 []과 같고, Number([])는 0이므로 0 * 0 - (-0)으로 바꿀 수 있다.

+!!NaN * "" - - [,]
+false * Number("") - -Number([])
0 * 0 - (-0)
0
profile
👨🏻‍💻

1개의 댓글

comment-user-thumbnail
2021년 12월 24일

대박 ㅋㅋㅋㅋㅋ

답글 달기