"true"== true가 JavaScript에서 false를 표시하는 이유는 무엇입니까?


89

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

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

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

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

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

내가 무엇을 놓쳤습니까?



6
주위에 너무 많은 자바 스크립트로, 세계는 무서운 장소 : if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}---> "예 아니오"
user1068352

1
나는 깜짝 놀랐다고 말해야하는데, 이런 일이 일어난다는 것은 너무 어리석은 일입니다. 또 다른 이유는 항상 항상 항상 === 사용
BT

답변:


89

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

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


그러면 단계 Can we convert both to a number?가 언제 거짓이 될지 말해 줄 수 있습니까 ? 짝수 인 경우 NaN어떻게이 단계가 실패 할 수 있습니까?
Isaac

5
둘 다. 둘 다 NaN이 발생하면 문자열 평가로 전환됩니다. 하나만 변환 할 수있는 경우에도 여전히 숫자 비교가 있습니다.
Erik Reppen 2012

2
실제로 Javascript에는 매우 이상하게 작동하는 이상한 개체가 있습니다. 예를 들어 IE <9의 XML 문서를 숫자로 변환하려고하면 오류가 발생합니다.
MaxArt 2012-07-06

당신은 수행하여 변환을 직접 볼 수 Number(true)Number('true')
에릭 Reppen을

10

==비교 연산자가된다 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

===> 거짓


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.