ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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" == ""이 되고. 이는 곧 거짓이 됩니다.


    댓글

Designed by black7375.