programing

JavaScript에서 ""== [null]이 true 인 이유는 무엇입니까?

nicescript 2021. 1. 13. 23:36
반응형

JavaScript에서 ""== [null]이 true 인 이유는 무엇입니까?


나는 JavaScript가 유형 간의 비교에서 많은 미친 결과를 가지고 있다는 것을 알고 있지만 이유를 완전히 이해하지는 못합니다. 오늘 이것을 보았습니다.

"" == [null]

trueJavaScript에서 평가 합니까?

@Qantas 덕분에 Javascript 평등 재미가 더 있습니다.


"추상 평등 비교 알고리즘은" 많은 부분이 있지만, 여기서 중요한 것은 이것이다 :

Type ( x )가 String 또는 Number이고 Type ( y )가 Object이면 비교 결과를 반환합니다 . x == ToPrimitive ( y ).

(거울 이미지도 있습니다.) 따라서은 ""문자열이고 [null]객체 이기 때문에 먼저 [null]를 호출하여 문자열 로 변환 해야합니다 ToPrimitive([null]). 이것은 Object 인스턴스를 기본 값으로 변환하라는 요청을받을 때 다음과 같이 설명되는 내부 작업입니다.

Object의 기본값을 반환합니다. 개체의 기본값은 개체의 [[DefaultValue]] 내부 메서드를 호출하고 선택적 힌트 PreferredType을 전달하여 검색됩니다 . [[DefaultValue]] 내부 메서드의 동작은 8.12.8의 모든 네이티브 ECMAScript 개체에 대해이 사양에 의해 정의됩니다.

이제 [[DefaultValue]] 내부 작업이 .toString()개체를 호출 하고 해당 값을 반환합니다. [null].toString()브라우저 콘솔에서 시도해보십시오 .

> [null].toString()
""

그리고 거기에 있습니다.

편집 : 그리고 왜 [null].toString()빈 문자열입니까? .toString()Array 인스턴스에 대한 작업은 항상를 호출 하기 때문에 .join()항상 nullundefined값에 대해 빈 문자열을 생성 합니다. 따라서 하나의 배열은 하나의 null빈 문자열로 끝납니다.


그것은 Javascript 의 신비한 유형 변환 규칙에 따른 것 입니다. 규칙 # 8 :

Type (x)가 String 또는 Number이고 Type (y)가 Object이면 비교 결과를 반환합니다. x == ToPrimitive (y).

비교는 사이에 그래서 x = ""y = [null]사용하여 문자열로 변환 ToPrimitive. 하나의 null 요소가있는 배열을 변환하면 빈 문자열이 생성되므로 ( Array.toString()쉼표로 구분 된 값 목록을 반환 하기 때문에 ) 동일한 것으로 평가됩니다.


"" == [null]사실로 평가됩니까?

엄격하지 않은 같음 연산자를== 사용하여 배열을 문자열과 비교하기 때문에 비교 하기 전에 값을 동일한 유형으로 캐스팅하려고 시도합니다.

자세한 내용은 다음과 같습니다.

  1. 문자열을 객체와 비교하므로 객체가 문자열로 캐스팅됩니다.
  2. 배열이 원시 값으로 캐스트되면 해당 .toString()메서드가 호출됩니다 (다른 답변에서 자세히 설명 됨). 이는 .join()다음 을 호출하는 것과 같습니다 .
  3. undefined또는 null값만 포함하는 단일 요소 배열의 경우 빈 문자열을 반환합니다.
  4. 마지막으로 빈 문자열과 동일합니다.

이 세 번째 단계는 예상치 못한 단계 ( [null]+"" != null+"")입니다. 실제로 문자열로 캐스트했다면 결과는되었을 "null"것이고 동등성은 거짓입니다.


사양을보고 각 단계를 수행해 보겠습니다.

비아가는 추상 평등 비교 알고리즘 (§11.9.3) :

  1. typeof ""; // string그리고 typeof [null]; // object그렇게 적용되지
  2. 어느 쪽도없는 nullundefined때문에 적용되지
  3. 2와 동일
  4. 둘 다 숫자도 아니고 적용 할 수 없습니다
  5. 4와 같음
  6. 둘 다 부울도 아니고 적용 할 수 없습니다
  7. 다시 적용 할 수 없습니다
  8. 마지막으로, 적용 가능한 것, 이제 우리는 알아야 할 ToPrimitive([null])

§9.1 ToPrimitive for Objects 는 우리가 해결해야한다고 말합니다 [[DefaultValue]](§8.12.8) , 포인트 1과 2는 당신이 할 수 .toString있고 문자열을 제공하면 그것을 반환합니다.

[null].toString(); // ""

그래서 우리는 이제 Abstract Equality Comparison Algorithm의 포인트 1에 의한 비교 "" == ""수행하고 있습니다 . d.true

If Type(x)Stringtrue 이면 xy이 문자 시퀀스가 ​​정확히 동일한 경우 (길이가 같고 해당 위치의 문자가 같음) 를 반환 합니다 . 그렇지 않으면을 반환하십시오 false.


JavaScript는 약한 유형입니다. 다음을 사용하여 잘못된 결과를 얻을 수 있습니다.

"" === [null]

null 값은 null 또는 "빈"값을 나타내는 JavaScript 리터럴입니다. 즉, 개체 값이 없습니다. JavaScript의 기본 값 중 하나입니다.

null 값은 리터럴입니다 (undefined와 같은 전역 개체의 속성이 아님). API에서 null은 개체가 예상 될 수 있지만 관련 개체가없는 위치에서 검색되는 경우가 많습니다. null 또는 undefined를 검사 할 때 같음 (==)과 ID (===) 연산자의 차이에주의하십시오 (전자로 형식 변환이 수행됨).

typeof null        // object (bug in ECMAScript, should be null)
typeof undefined   // undefined
null === undefined // false
null  == undefined // true

ReferenceURL : https://stackoverflow.com/questions/25531424/why-is-null-true-in-javascript

반응형