2012-02-17 3 views
8

this answer에는 원시 값을 포함하는 배열에 대해 배열 동일성을 반환하는 간단한 함수가 있습니다.이것이 JavaScript 배열의 동등성을 증명하는 이유는 무엇입니까?

그러나 왜 작동하는지 잘 모르겠습니다. 함수는 다음과 같습니다.

function arrays_equal(a,b) { return !!a && !!b && !(a<b || b<a); } 

저는 주로 후반부에 관심이 있습니다. 이 비트 :

!(a<b || b<a) 

왜 배열을 <> 일 비교 않을 때하지만 ==은하지 않습니다?

less than 및 greater than 메소드는 JavaScript 내에서 어떻게 작동합니까?

답변

10

</>을 사용하면 배열이 먼저 문자열로 변환되므로 신뢰할 수있는 등호 검사 방법이 제공되지 않습니다.

개체를 참조에 의해 확인되기 때문에 ==가 작동하지 않습니다

:

[] == []; // false, two separate objects 

var a = []; 
a == a; // true, refer to the same object 

</> 트릭은 결함이있다 : 그들은 때문에

var a = [1, [2, 3]], 
    b = [[1, 2], 3]; 

!(a<b || b<a); // true 

이, true로 평가가 모두 문자열로 변환 "1,2,3"을 검사하기 전에 확인하십시오 (</>). 개체에 대해 "직접"작동하지 않습니다.

기본적으로 문자열의 평등을 비교하고 있습니다. 문자열의 경우 a == b은 실제로 !(a<b || b<a) - </>과 동일하므로 두 개의 동일한 문자열은 문자열의 모든 문자 코드에 해당하지 않으므로 "작거나"큽니다.

+0

+1 : 당신이 비 네이티브 JSON.stringify을 사용할 때,이 같은 순환 입력에 이상한 일을 할 수 있습니다. 멋진 언어 – Sarfraz

+0

@Sarfraz : 예, 몇 가지 불쾌한 디버깅 후 직접 같은 것을 발견 할 때까지 ... – pimvdb

+0

최근에 배우기 시작했습니다 **. 당신은 방법으로 블로그를 가지고 있어야합니다 :) – Sarfraz

4

==을 사용하여 두 개체를 비교할 수 있습니다. 그러나> 및 <은 개체에 대해 정의되지 않았으므로 문자열로 변환됩니다. 따라서 [1,2,3]>[2,1,3]이 실제로 수행하고 있습니다. "1,2,3">"2,1,3"

+1

올바르지 않습니다. 변환이 항상 문자열로 이어지는 것은 아닙니다. [11.8.5] (http://es5.github.com/#x11.8.5)는 객체 변환이 타입 힌트''number "'로 일어나도록 지정합니다. 그래서'arrays_equal (new Date (1), 1)'은'true '. –

+0

고마워요. 그리고 그의 코멘트에 대한 설명을 위해 마이크에게! –

5

그러나 왜 작동하는지 잘 모르겠습니다.

작동하지 않습니다.

arrays_equal(["1,2"], [1,2]) 

이 요소 현명한 비교를 기반으로 배열 평등의 정의에 의해, 서로 다른 경우에도 실제 생산 고려하십시오.

arrays_equal([[]], []) 

arrays_equal([""], []) 

도 가짜 긍정적이다.

간단히

arrays_equal(["1,2",3], [1,"2,3"]) 

arrays_equal(
    ["",","], 
    [",",""]) 

편집에 의해 입증 된 바와 같이 length 검사가 도움이되지 않습니다 추가 : 당신이 간결 방법은 구조적 유사성을 테스트하려면

, 내가 제안 :

function structurallyEquivalent(a, b) { 
    return JSON.stringify(a) === JSON.stringify(b); 
} 

이 분명히 다른 입력에 대해서는 일찍 멈추지 않습니다. 오브젝트 그래프가 얼마나 다른지에 관계없이 두 그래프를 모두 처리하지만 OP.

한 가지주의 : 뭔가 새로운 JS에서 하루를 받고

var input = []; 
input[0] = input; 
+1

프리미티브라도 'JSON.stringify'는 완전히 신뢰할 수 없습니다. '[,]'와'[null]'을 고려하십시오. – pimvdb

+0

@pimvdb, 예. 그것은'null'과'undefined'/elipsis를 결합하지만 JavaScript는'=='입니다. OP의 어떤 것도'==='보다는'==='에 대한 선호를 표현하지 않습니다. –

+0

감사합니다, 당신의 대답은 @ pimvdb 's와 함께 나의 이해를 돕습니다. –

관련 문제