>웹 프론트엔드 >JS 튜토리얼 >부울 반환 값이 JavaScript의 정렬 비교 함수에서 예기치 않은 결과를 초래하는 이유는 무엇입니까?

부울 반환 값이 JavaScript의 정렬 비교 함수에서 예기치 않은 결과를 초래하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-16 19:09:21271검색

Why Do Boolean Return Values Cause Unexpected Results in JavaScript's Sort Comparison Functions?

JavaScript 정렬: 비교 함수의 부울 반환 값

문제

일반적인 관례에도 불구하고 부울 값(true 또는 false)을 반환하는 JavaScript에서 정렬에 사용되는 비교 함수가 올바르지 않아 예상치 못한 결과가 발생할 수 있습니다.

이유

정렬 알고리즘은 비교 함수가 숫자를 반환할 것으로 예상합니다. 특히:

  • 첫 번째 인수가 두 번째 인수 다음에 정렬되어야 하는 경우 양수
  • 0 두 인수가 동일한 것으로 간주되는 경우
  • A 음수 첫 번째 인수가 두 번째 인수보다 먼저 정렬되어야 하는 경우

부울 값(false는 0과 같고 true는 1과 같음)을 반환하면 일관된 비교 함수에 대한 전이성 요구 사항이 실패합니다. . 이 요구 사항은 정렬 알고리즘이 이전 비교를 기반으로 요소 순서를 추론할 수 있도록 보장합니다.

놀라운 시연

비교 기능을 고려하세요.

function compare(a, b) {
    return a > b;
}

이것은 함수는 'a'가 'b'보다 큰 경우 true(또는 1)를 반환하지만 'b'가 'b'보다 큰 경우에도 false(또는 0)를 잘못 반환합니다. '아'. 결과적으로 정렬 알고리즘은 'a'와 'b'를 동일하게 처리하므로 예측할 수 없는 정렬 순서가 발생합니다.

반례

일부 기본 테스트를 통과했음에도 불구하고 위의 비교 함수는 특정 상황에서 실패합니다. 예:

[0, 1, 0].sort(compare);  // Result: [0, 1, 0] (expected: [0, 0, 1])
[1, 1, 0, 2].sort(compare);  // Result: [0, 1, 2, 1] (expected: [0, 1, 1, 2])

올바른 비교 기능

사전순 정렬(오름차순), 요소가 비교를 위해 자동으로 문자열로 변환되므로 비교 기능을 사용하지 않습니다.

숫자 정렬의 경우 다음을 사용합니다.

function compareNumbers(a, b) {
    return a - b;
}

더 복잡한 비교를 위해서는 조건부 사용 적절한 숫자를 반환하는 명령문:

function compareObjects(a, b) {
    if (a.property > b.property) return 1;
    if (a.property < b.property) return -1;
    return 0;
}

위 내용은 부울 반환 값이 JavaScript의 정렬 비교 함수에서 예기치 않은 결과를 초래하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.