통역사 / 콘솔을 부팅하고 비교해보십시오.
> ",,," == Array(4)
True
왜? 처음에는 “,,”를 ‘\ 0’으로 끝나는 슬라이스가있는 4 개의 문자 배열로 생각할 수 있기 때문에 아마도 그럴 것이라고 생각했지만,
> "..." == Array(4)
“False”를 반환합니다. 왜? Javascript에서 덕 타이핑의 특이한 부분이 있다는 것을 알고 있지만이 동작을 강조하는 것이 무엇인지 궁금합니다. Zed Shaw의 훌륭한 프레젠테이션 에서 이것을 수집했습니다 btw .
답변
오른손 피연산자는 문자열로 변환되고의 문자열 표현 Array(4)
은 ,,,
다음과 같습니다.
> Array(4).toString()
",,,"
배열 생성자 함수를 사용하고 숫자를 전달하면 배열의 길이가 해당 숫자로 설정됩니다. 따라서 네 개의 빈 인덱스 (와 동일 [,,,]
)가 있고 배열의 기본 문자열 표현이 쉼표로 구분 된 요소 목록 이라고 말할 수 있습니다 .
> ['a','b','c'].toString()
"a,b,c"
비교 작동 방식은 사양의 섹션 11.9.3에 설명되어 있습니다. ( x == y
) 가 표시됩니다 .
8. Type ( x )가 String 또는 Number이고 Type ( y )가 Object이면
비교 결과 x == ToPrimitive ( y )를 반환합니다 .
(배열은 JavaScript의 객체입니다)
그리고 ToPrimitive
메소드를 따르면 결국 toString
.
답변
내부적으로
",,," == Array(4).toString()
답변
을 사용해보십시오 ===
. ==
Javascript에서 사용할 때 변수 캐스팅을 시도하므로 이와 같은 문제가 발생합니다. 콘솔은 캐스팅되어 Array(4)
문자열 표현 (즉에 Array(4).toString
있다) ",,,"
. 쉼표가있는 이유는 .toString()
함수가 배열의 개별 항목에 추가하기 때문입니다.
아래 스 니펫을 참조하세요.
document.write( Array(4).toString() );
답변
이것은 Array(4)
4 개의 빈 값으로 구성된 배열을 초기화 ==
하므로 암시 적으로 다음과 같이 변환되기 때문입니다.
",,," == Array(4)
",,," == Array(4).toString()
",,," == ["", "", "", ""] // note 3 commas for 4 values
",,," == ["", "", "", ""].toString()
모두 비슷합니다.
==
값을 비교하기 전에 암시 적 형식 변환을 수행하므로 예기치 않은 결과가 발생할 수 있습니다. ===
유형 및 값을 확인하는 데 사용 합니다.
답변
배열을 문자열과 비교하면 비교를 수행하기 전에 배열이 문자열로 강제 변환됩니다. 빈 4 개 요소 배열을 문자열로 강제 변환하면 정확한 문자열이 생성됩니다.
답변
처음에는 “프로토 타입”이라고 생각했는데 … 약간의 조사 끝에 슬픈 결론에 도달했습니다 …
분명히 그것은 논리가 많지 않은 내부적이고 더 모호한 js입니다 …
단지 시도
Array(4)==Array(4)
유형에 대한 강요도 없습니다 …
Array(4)===Array(4)
그리고 당신은 거짓을 얻을 것입니다
당신은 알고 null==null
, null===null
심지어 undefined==undefined
하고 undefined===undefined
그래서 …이 조금 모호의 … 반환 TRUE …
Array(4)==[,,,]
또한 사실이어야한다