https://jsisweird.com
자바스크립트의 이상한 문법을 퀴즈로 풀어보았다. 25문제중에 14문제밖에 못맞췄다...
이래서는 자바스크립트 한다고 하면 안될거 같아서 퀴즈들을 정리해 보았다.
true + false
정답: 1
+
연산에서 Boolean 값은 Number로 형변환한다.
true + false
Number(true) + Number(false)
1 + 0
1
[,,,].length
정답: 3
마지막 comma는 trailing comma이고, 나머지 3개의 공간에는 자동으로 undefined가 들어간다.
[,,,]
[undefined, undefined, undefined,]
[undefined, undefined, undefined]
[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'
0.2 + 0.1 === 0.3
정답: false
부동소수점 문제로 정확한 값이 나오지 않는다.
0.2 + 0.1
0.30000000000000004
10,2
정답: 2
쉼표 연산자는 마지막 값을 반환한다.
!!""
정답: false
!
연산자는 값을 Boolean형으로 형변환 시키고 not을 취하는 연산자이다.
!!""
!!Boolean("")
!!false
!true
false
+!![]
정답: 1
단항 +
연산자는 값을 Number형으로 형변환 시킨다.
+!![]
+!!Boolean([])
+!!true
+!false
+true
1
!!!true
정답: false
!!!true
!!false
!true
false
true == "true"
정답: false
Abstract Equality Comparison 연산자 ==
는 비교할때 Number로 형변환된다.
===
는 false니까 당연히==
는 true인줄 알았다 ㄷㄷ
true == "true"
Number(true) == Number("true")
1 == NaN
false
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
"" - - ""
정답: 0
-
연산에서 문자열은 Number로 형변환되고, 오른쪽 -
연산자는 -0
으로 바뀐다. - -
대신 --
로 붙이면 SyntaxError
가 난다
"" - - ""
Number("") - - Number("")
0 - - 0
0 - -0
0 - 0
0
null + 0
정답: 0
+
연산에서 null
은 Number로 형변환된다.
null + 0
Number(null) + 0
0 + 0
0
0/0
정답: NaN
그냥 0/0은 NaN이다.
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
true++
정답: SyntaxError
변수가 아닌곳에 ++
연산자는 SyntaxError
가 난다.
true++; // SyntaxError
1++; // SyntaxError
"x"++; // SyntaxError
null++; // SyntaxError
undefined++; // NaN
NaN++; // NaN
let _true = true;
_true++;
_true; // 2
"" - 1
정답: -1
-
연산자는 문자열을 Number로 형변환한다. 이때 +
연산자는 문자열을 합치는 기능이 있지만 -
연산자는 그런 기능이 없다.
"" - 1
Number("") - 1
0 - 1
-1
// + 연산자는?
"" + 1
"" + "1"
"1"
(null - 0) + "0"
정답: "00"
(null - 0) + "0"
(Number(null) - 0) + "0")
(0 - 0) + "0"
0 + "0"
"00"
true + ("true" - 0)
정답: NaN
true + ("true" - 0)
true + (Number("true") - 0)
true + (NaN - 0)
true + NaN
NaN
!5 + !5
정답: 0
!5 + !5
!true + !true
false + false
0 + 0
0
[] + []
정답: ""
[] + []
[].toString() + [].toString()
"" + ""
""
1 + 2 + "3"
정답: "33"
1 + 2 + "3"
3 + "3"
"33"
typeof NaN
정답: "number"
NaN
은 Number 형이다.
number value that is a IEEE 754 “Not-a-Number” value
undefined + false
정답: "NaN"
undefined
를 Number로 형변환하면 NaN이다.
Number(undefined) + Number(false)
NaN + 0
NaN
"" && -0
정답: ""
&&
연산자는 첫번째 값이 거짓이면 첫번째 값을 반환하고, 그외의 경우에는 두번째 값을 반환한다. 문제의 경우에는 첫번째 값이 거짓이므로 첫번째 값이 반환된다.
"" && -0
""
+!!NaN * "" - - [,]
정답: 0
+!!NaN
은 0이고, Number("")
도 0이다. [,]
은 trailing comma이므로 []
과 같고, Number([])
는 0이므로 0 * 0 - (-0)
으로 바꿀 수 있다.
+!!NaN * "" - - [,]
+false * Number("") - -Number([])
0 * 0 - (-0)
0
대박 ㅋㅋㅋㅋㅋ