Javascript에서 ",,,"== Array (4)가되는 이유는 무엇입니까?


119

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

> ",,," == Array(4)
True

왜? 처음에는 ",,"를 '\ 0'으로 끝나는 슬라이스가있는 4 개의 문자 배열로 생각할 수 있기 때문에 아마도 그럴 것이라고 생각했지만,

> "..." == Array(4)

"False"를 반환합니다. 왜? Javascript에서 덕 타이핑의 특이한 부분이 있다는 것을 알고 있지만이 동작을 강조하는 것이 무엇인지 궁금합니다. Zed Shaw의 훌륭한 프레젠테이션 에서 이것을 수집했습니다 btw .


14
C를 제외한 몇몇 언어는 프로그래머가 볼 수있는 방식으로 0 종료를 사용합니다.
Joey

7
내가 물어 보면이 발견으로 이어진 것은 무엇입니까?
SomeKittens 2012-06-05

1
@SomeKittens Zed Shaw는 내 질문에 링크 한 비디오 (Javascript에 대한 비판)에서이를 명시 적으로 언급합니다. 건배!
ZenLikeThat

5
@SomeKittens 이것은 (아주 잘 알려진) "wat"토크에서도 언급되어 루비와 자바 스크립트의 단점을 보여줍니다 destroyallsoftware.com/talks/wat
Cronco

5
이것은 항상 ===대신을 사용해야 하는 많은 좋은 이유 중 하나 입니다 ==.
wprl

답변:


178

오른손 피연산자는 문자열로 변환되고의 문자열 표현 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.


2
좋아요, 이제이 모든 것이 제게 말이됩니다. 감사.
ZenLikeThat

6
이는 배열이 .NET을 사용하는 것처럼 문자열 화되기 때문 Array.join(",")입니다.
duskwuff -inactive-

당신은 자바 스크립트로 프로그래밍하려면 피의 환자가되어야합니다
matcheek


31

을 사용해보십시오 ===. ==Javascript에서 사용할 때 변수 캐스팅을 시도하므로 이와 같은 문제가 발생합니다. 콘솔은 캐스팅되어 Array(4)문자열 표현 (즉에 Array(4).toString있다) ",,,". 쉼표가있는 이유는 .toString()함수가 배열의 개별 항목에 추가하기 때문입니다.

아래 스 니펫을 참조하세요.

document.write( Array(4).toString() );


18

이것은 Array(4)4 개의 빈 값으로 구성된 배열을 초기화 ==하므로 암시 적으로 다음과 같이 변환되기 때문입니다.

 ",,," == Array(4)

 ",,," == Array(4).toString()

 ",,," == ["", "", "", ""] // note 3 commas for 4 values

 ",,," == ["", "", "", ""].toString()

모두 비슷합니다.

==값을 비교하기 전에 암시 적 형식 변환을 수행하므로 예기치 않은 결과가 발생할 수 있습니다. ===유형 및 값을 확인하는 데 사용 합니다.


5

배열을 문자열과 비교하면 비교를 수행하기 전에 배열이 문자열로 강제 변환됩니다. 빈 4 개 요소 배열을 문자열로 강제 변환하면 정확한 문자열이 생성됩니다.


4

처음에는 "프로토 타입"이라고 생각했는데 ... 약간의 조사 끝에 슬픈 결론에 도달했습니다 ...

분명히 그것은 논리가 많지 않은 내부적이고 더 모호한 js입니다 ...

단지 시도

Array(4)==Array(4)

유형에 대한 강요도 없습니다 ...

Array(4)===Array(4)

그리고 당신은 거짓을 얻을 것입니다

당신은 알고 null==null, null===null심지어 undefined==undefined하고 undefined===undefined그래서 ...이 조금 모호의 ... 반환 TRUE ...

Array(4)==[,,,] 또한 사실이어야한다


ZEE, Array (4) == [,,,]는 사실이 아닙니다. 객체를 프리미티브와 비교하면 객체가 프리미티브로 변환됩니다. 그것이 toString ()을 호출하는 이유입니다.
devsathish

array (x)는 생성자의 주소 여야합니다 ... 어쨌든, 시스템에서 (어떤 종류의 시스템을 신경 쓰지 마십시오), <identity_X> === <identity_X> sould는 항상 참입니다!
ZEE
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.