[javascript] Javascript에서 “,,,”== Array (4)가되는 이유는 무엇입니까?

통역사 / 콘솔을 부팅하고 비교해보십시오.

> ",,," == 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)==[,,,] 또한 사실이어야한다


답변