-
[JS] javascript에서 비교연산의 특수한 경우programing/Language 2018. 4. 7. 15:06
안녕하세요, Einere입니다.
오늘은 Javascript에서, 비교연산의 특수한 경우에 대해 알아보고자 합니다.
위 그림은 일반적으로 오해하기 쉬운 비교연산의 결과를 보여주는 짤방입니다.
0 == "0" -> true
0 == [] -> true
이기 때문에, "0" == [] 또한 true일 것 같지만, 반환값은 false입니다.
왜 이런 결과가 나오는지 설명하도록 하겠습니다.
참조 : ECMA-262 8th edition 7.2.13 Abstract Equality Comparison
설명을 위해 부분 발췌하였습니다.
0 == "0"에 대해서,
4. If Type(x) is Number and Type(y) is String, return the result of the comparison x == ToNumber(y).
즉, 0 == ToNumber(y)의 형태로 바뀌게 되고, ToNumber 추상 명령의 알고리즘에 따라 문자열은 숫자로 파싱되게 되므로. 0 == 0 의 형태가 되어 참이 됩니다.
0 == []에 대해서,
8. If Type(x) is either String, Number, or Symbol and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).
즉, 0 == ToPrimitive([]) 형태로 바뀌게 되고, ToPrimitive에서 OrdinaryToPrimitive([], "number")을 호출하고, OrdinaryToPrimitive의 알고리즘에 의해 valueOf, toString 순으로 우선권을 갖지만. ([]).valueOf() 는 객체를 반환하므로, toString이 call되고, 빈 배열의 경우 toString은 빈 문자열을 반환합니다.
결과적으로 0 == ""이 되고, 이는 위에서 보았듯이 0 == ToNumber("")의 형태가 됩니다. ToNumber 추상 명령에서는 빈 문자열의 경우 +0을 반환하게 되어 있으므로, 0 == +0의 형태가 되고. 이는 참이 됩니다.
"0" == []에 대해서,
8. If Type(x) is either String, Number, or Symbol and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).
즉, "0" == ToPrimitive([])의 형태가 되고, 아까 위에서 언급했듯이, ToPrimitive는 빈 문자열을 반환하게 되어, "0" == ""이 되고. 이는 곧 거짓이 됩니다.
'programing > Language' 카테고리의 다른 글
[C#] MenuStrip에서 MenuItem 얻기. (0) 2018.05.27 [C#] system.badimageformatexception 해결방법 (0) 2018.05.21 [Shell Script] File Explorer (0) 2017.09.10 [C++] 다양한 생성자들 (0) 2017.09.03 [Shell Script] File Explorer Shell Script (0) 2017.06.13 댓글