JavaScript에서 ""== [null]이 true 인 이유는 무엇입니까?
나는 JavaScript가 유형 간의 비교에서 많은 미친 결과를 가지고 있다는 것을 알고 있지만 이유를 완전히 이해하지는 못합니다. 오늘 이것을 보았습니다.
왜
"" == [null]
true
JavaScript에서 평가 합니까?
@Qantas 덕분에 Javascript 평등 재미가 더 있습니다.
- JavaScript에서 2 == [2]가되는 이유는 무엇입니까?
- JavaScript에서 0 == ""이 true 인 이유
- 자바 스크립트에서 [] == false 인 동안 if ([])가 검증되는 이유는 무엇입니까?
- JavaScript에서! {} [true]가 true로 평가되는 이유는 무엇입니까?
"추상 평등 비교 알고리즘은" 많은 부분이 있지만, 여기서 중요한 것은 이것이다 :
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()
항상 null
및 undefined
값에 대해 빈 문자열을 생성 합니다. 따라서 하나의 배열은 하나의 null
빈 문자열로 끝납니다.
그것은 Javascript 의 신비한 유형 변환 규칙에 따른 것 입니다. 규칙 # 8 :
Type (x)가 String 또는 Number이고 Type (y)가 Object이면 비교 결과를 반환합니다. x == ToPrimitive (y).
비교는 사이에 그래서 x = ""
및 y = [null]
사용하여 문자열로 변환 ToPrimitive
. 하나의 null 요소가있는 배열을 변환하면 빈 문자열이 생성되므로 ( Array.toString()
쉼표로 구분 된 값 목록을 반환 하기 때문에 ) 동일한 것으로 평가됩니다.
왜
"" == [null]
사실로 평가됩니까?
엄격하지 않은 같음 연산자를==
사용하여 배열을 문자열과 비교하기 때문에 비교 하기 전에 값을 동일한 유형으로 캐스팅하려고 시도합니다.
자세한 내용은 다음과 같습니다.
- 문자열을 객체와 비교하므로 객체가 문자열로 캐스팅됩니다.
- 배열이 원시 값으로 캐스트되면 해당
.toString()
메서드가 호출됩니다 (다른 답변에서 자세히 설명 됨). 이는.join()
다음 을 호출하는 것과 같습니다 . undefined
또는null
값만 포함하는 단일 요소 배열의 경우 빈 문자열을 반환합니다.- 마지막으로 빈 문자열과 동일합니다.
이 세 번째 단계는 예상치 못한 단계 ( [null]+"" != null+""
)입니다. 실제로 문자열로 캐스트했다면 결과는되었을 "null"
것이고 동등성은 거짓입니다.
사양을보고 각 단계를 수행해 보겠습니다.
비아가는 추상 평등 비교 알고리즘 (§11.9.3) :
typeof ""; // string
그리고typeof [null]; // object
그렇게 적용되지- 어느 쪽도없는
null
나undefined
때문에 적용되지 - 2와 동일
- 둘 다 숫자도 아니고 적용 할 수 없습니다
- 4와 같음
- 둘 다 부울도 아니고 적용 할 수 없습니다
- 다시 적용 할 수 없습니다
- 마지막으로, 적용 가능한 것, 이제 우리는 알아야 할
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
이면x
및y
이 문자 시퀀스가 정확히 동일한 경우 (길이가 같고 해당 위치의 문자가 같음) 를 반환 합니다 . 그렇지 않으면을 반환하십시오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
'programing' 카테고리의 다른 글
Firefox 브라우저에서 모바일 장치를 시뮬레이션하고 디버그하려면 어떻게해야합니까? (0) | 2021.01.13 |
---|---|
PEP8 표준을 준수하기에는 너무 많은 인수로 함수 정의 (0) | 2021.01.13 |
PACKETS와 FRAMES의 차이점 (0) | 2021.01.13 |
angular2 라우터에서 페이지 제목을 변경하는 방법 (0) | 2021.01.13 |
Spring Boot Rest 서비스에서 파일 다운로드 (0) | 2021.01.13 |