[javascript] “true”== true가 JavaScript에서 false를 표시하는 이유는 무엇입니까?

MDC는 ==연산자를 다음과 같이 설명합니다 .

두 피연산자가 동일한 유형이 아닌 경우 JavaScript는 피연산자를 변환 한 다음 엄격한 비교를 적용합니다. 피연산자가 숫자이거나 부울이면 피연산자는 가능한 경우 숫자로 변환됩니다. 그렇지 않으면 피연산자 중 하나가 문자열이면 다른 피연산자는 가능한 경우 문자열로 변환됩니다.

이를 염두에두고 "true" == true다음과 같이 평가 합니다.

  1. 같은 유형입니까? 아니
  2. 피연산자가 숫자 또는 부울입니까?
  3. 둘 다 숫자로 변환 할 수 있습니까? 아니요 ( isNaN(Number("true")) // true)
  4. 피연산자가 문자열입니까?
  5. 다른 피연산자를 문자열로 변환 할 수 있습니까? ( String(true) === "true" // true)

로 평가되어야 하는 문자열 "true"and로 끝났지 만 JavaScript는 false를 표시합니다."true"true

내가 무엇을 놓쳤습니까?



답변

은로 "true"변환 되기 때문에 NaNwhile true로 변환됩니다 1. 그래서 그들은 다릅니다.

당신이보고 한 것처럼, 둘 다 숫자로 변환되고, 적어도 true될 수 있기 때문에 (Erik Reppen의 코멘트 참조), 그리고 비교할 수 있습니다.


답변

==비교 연산자가된다 ECMA 5 항 과 같이

  1. 경우 유형 (X)의 수이며 유형 (Y)는 문자열이며,
    비교 X ==의 결과 반환 ToNumber (y)를.
  2. 경우 유형 (X)가 문자열이고 형식 (Y)의 수이며,
    비교의 결과를 반환 ToNumber (x)를 == y로.
  3. 경우 입력 (X)는 부울, 상기 비교의 결과 복귀 ToNumber (X) (Y)를 ==.
  4. 경우 입력 (Y)는 부울, 비교 X == 결과 반환 ToNumber (y)를.

따라서 “true”== true는 다음과 같이 평가됩니다.

  1. “true”== ToNumber (true)   (규칙 7을 통해)
  2. “참”== 1
  3. ToNumber ( “true”) == 1   (규칙 5를 통해)
  4. NaN == 1

===> 거짓


답변

추상 평등 비교 알고리즘에 따르면

http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

oprend 중 하나가 부울이고 다른 하나가 아닌 경우 부울은 숫자 0 또는 1로 변환되므로 true == "true"거짓입니다.


답변