JS 잘 알려 지지 않 은 문제 의[]==![]결 과 는 true 이 고{}==!{}false
console.log( [] == ![] ) // true
console.log( {} == !{} ) // false
문자열,수치,불 값 의 동일성 을 비교 할 때 문 제 는 비교적 간단 하 다.그러나 대상 과 의 비교 에 있어 서 문 제 는 복잡 해 졌 다.최초의 ECMAScript 의 동일 과 일치 하지 않 는 연산 자 는 비 교 를 실행 하기 전에 대상 을 비슷 한 유형 으로 변환 합 니 다.이후 이런 전환 이 과연 합 리 적 인지 의문 이 제기 됐다.마지막 으로 ECMAScript 의 해결 방안 은 두 개의 조작 자 를 제공 하 는 것 입 니 다.상등 과 불 등―먼저 바 꾸 고 비교 하 자. (==)
전 등 과 부전 등―비교 만 하고 전환 하지 않 는 다. (===)
ECMAScript 에서 같은 조작 부 호 는 두 개의 등호(==)로 표시 되 며,두 조작 수가 같 으 면 true 로 되 돌아 갑 니 다.이 조작 부 호 는 먼저 조작 수(일반적으로 강제 전환 이 라 고 함)를 바 꾼 다음 에 그들의 동일성 을 비교 합 니 다.
서로 다른 데이터 형식 을 변환 할 때 같은 조작 자 와 같 지 않 은 조작 자:JS 고도 의 책 에서 다음 과 같은 기본 변환 규칙 을 제시 합 니 다.
① 만약 에 하나의 조작 수가 불 값 이 라면 비교 동일성 전에 이 를 수치 인 false 를 0 으로 바 꾸 고 true 는 1 로 전환한다.
②,만약 하나의 조작 수가 문자열 이 라면,다른 조작 수 는 수치 이 며,비교 하기 전에 문자열 을 수치 로 변환 합 니 다
③,만약 에 하나의 조작 수가 대상 이 고 다른 조작 수가 아니라면 대상 의 value Of()방법 을 사용 하여 얻 은 기본 유형 값 을 앞의 규칙 에 따라 비교 합 니 다.
이 두 조작 부 호 는 비교 할 때 아래 의 규칙 을 따라 야 한다.
① null 과 undefined 는 같다.
②、상대 성 을 비교 하기 전에 null 과 undefined 를 다른 값 으로 변환 할 수 없습니다.
③、하나의 조작 수가 NaN 이면 같은 조작 자 는 false 로 돌아 가 고 같은 조작 자 는 true 로 돌아 가지 않 습 니 다.중요 한 알림:두 조작 수가 모두 NaN 이 더 라 도 같은 조작 자 는 false 로 돌아 갑 니 다.왜냐하면 규칙 에 따 르 면,NaN 은 NaN 과 같 지 않 기 때문이다.
④、두 조작 수가 모두 대상 이 라면 같은 대상 인지 비교 하고 두 조작 수가 같은 대상 을 가리 키 면 같은 조작 부호 가 true 로 돌아간다.그렇지 않 으 면 false 로 돌아 갑 니 다.
여기 서 다음 과 같은 문 제 를 말씀 드 리 겠 습 니 다.[]와{}은 모두 인용 형식 입 니 다.인용 형식 은 메모리 에 저장 되 어 있 고 스 택 메모리 에 하나 이상 의 주소 가 있 습 니 다.이 메모리 에 해당 하 는 데 이 터 를 가리 키 고 있 습 니 다.그래서==연산 자 를 사용 할 때 인용 형식의 데 이 터 는 실제 값 이 아니 라 주소 입 니 다.
이제[]==![]왜 true
① 연산 자 우선 순위 에 따라!의 우선 순 위 는=보다 크 기 때문에 먼저 실행 합 니 다![]
!변 수 를 boolean 형식 으로 변환 할 수 있 습 니 다.null,undefined,NaN 및 빈 문자열(')은 모두 true 이 고 나머지 는 false 입 니 다.
그래서![]연산 후의 결 과 는 false 이다.
바로[]==![]false
② 위 에서 언급 한 규칙(하나의 조작 수가 불 값 이 라면 비교 동일성 전에 수치-false 를 0 으로 바 꾸 고 true 를 1 로 바 꾸 는 것)에 따라 false 를 0 으로 바 꿔 야 한다.
바로[]==![]에 해당 하 다[]==false 에 해당 하 다[]==0
③ 위 에서 언급 한 규칙(한 조작 수가 대상 이 고 다른 조작 수가 아니라면 대상 의 value Of()방법 을 호출 하여 얻 은 기본 유형 값 을 앞의 규칙 에 따라 비교 하고 대상 이 value Of()방법 이 없 으 면 toString()을 호출 합 니 다)
빈 배열 에 대해 서 는[].toString()-> '' (빈 문자열 을 되 돌려 줍 니 다)
그 러 니까 [] == 0 은'='에 해당 한다
④、위 에서 언급 한 규칙 에 따라(한 조작 수가 문자열 이 라면 다른 조작 수 는 수치 이 며,비교 가 되 기 전에 문자열 을 수치 로 변환 합 니 다)
Number(')->0 을 되 돌려 줍 니 다.
0===0 에 해당 하면 자 연 스 럽 게 true 로 돌아 갑 니 다.
요약:
[] == ! [] -> [] == false -> [] == 0 -> '' == 0 -> 0 == 0 -> true
그럼{}==!{}마찬가지 입 니 다.
관건 은 {}.toString() -> NaN(돌아 온 건 NaN)
위의 규칙 에 따라(만약 하나의 조작 수가 NaN 이 라면,같은 조작 부호 가 false 로 되 돌아 갑 니 다)
요약:
{} == ! {} -> {} == false -> {} == 0 -> NaN == 0 -> false
그러면 여러분 을 믿 고 다음 두 문 제 를 손 가 는 대로 집 었 습 니 다.
console.log( [] == !{} ) // true
console.log( {} == ![] ) // false
총결산JS 가 잘 알려 지지 않 은 문제 에 대한[]=![]결 과 는 true 이 고{}==!{}false 를 위 한 글 은 여기까지 소개 되 었 습 니 다.JS[]==![]결 과 는 트 루 콘 텐 츠 입 니 다.저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[2022.04.19] 자바스크립트 this - 생성자 함수와 이벤트리스너에서의 this18일에 this에 대해 공부하면서 적었던 일반적인 함수나 객체에서의 this가 아닌 오늘은 이벤트리스너와 생성자 함수 안에서의 this를 살펴보기로 했다. new 키워드를 붙여 함수를 생성자로 사용할 때 this는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.