Array.prototype.includes 대 Array.prototype.indexOf


112

향상된 가독성 외에도 includesover에 대한 이점이 indexOf있습니까? 저와 똑같아 보입니다.

이것의 차이점은 무엇입니까

var x = [1,2,3].indexOf(1) > -1; //true

이?

var y = [1,2,3].includes(1); //true

12
includes훨씬 더 나쁜 브라우저 지원이 있습니다.
Quentin

4
참고 includesES6 / ES2015의 일부가 아닙니다. ECMAScript의 차기 버전에 대한 제안이며 올해 추가 될 예정입니다.
Felix Kling

4
includesIE에서 전혀 지원되지 않는 것도 언급하고 싶었습니다
ZvKa

답변:


138

tl; dr : NaN 은 다르게 취급됩니다.

  • [NaN].indexOf(NaN) > -1 이다 false
  • [NaN].includes(NaN) 이다 true

로부터 제안 :

자극

ECMAScript 배열을 사용할 때 일반적으로 배열에 요소가 포함되어 있는지 확인하는 것이 좋습니다. 이에 대한 일반적인 패턴은 다음과 같습니다.

if (arr.indexOf(el) !== -1) {
    ...
}

다른 다양한 가능성, 예를 들어 arr.indexOf(el) >= 0, 또는~arr.indexOf(el) .

이러한 패턴에는 두 가지 문제가 있습니다.

  • 그들은 "당신이 의미하는 바를 말"하지 못합니다. 배열에 요소가 포함되어 있는지 묻는 대신 배열에서 해당 요소의 첫 번째 발생 인덱스가 무엇인지 묻고이를 비교하거나 비트를 비틀 어서 결정합니다. 실제 질문에 대한 답변입니다.
  • Strict Equality Comparison NaNindexOf사용하므로 실패합니다 [NaN].indexOf(NaN) === -1.

제안 된 해결책

Array.prototype.includes위의 패턴을 다음과 같이 재 작성할 수 있는 방법 추가를 제안합니다.

if (arr.includes(el)) {
    ...
}

이것은 Strict Equality Comparison 대신 SameValueZero 비교 알고리즘을 사용하여 사실이된다는 점을 제외하고는 위와 거의 동일한 의미를 갖습니다 [NaN].includes(NaN).

따라서이 제안은 기존 코드에서 볼 수있는 두 가지 문제를 모두 해결합니다.

우리는 추가로 추가 fromIndex유사 매개 변수를, Array.prototype.indexOf그리고 String.prototype.includes일관성을 위해.


추가 정보 :


1
진실의 절반 만. 또한 다른 점 : 누락 된 요소는에서로 처리되고 undefined에서 .includes()고려되지 않습니다 .indexOf().
Robert Siemer

11

성능에 대해 궁금하다면 현재 indexOf가 더 빠르지 만이 JSperf 테스트는 시간이 지날 includes()수록 더 빠를 것임을 보여주는 경향 이 있습니다.indexOf 최적화 될 것 같습니다).

이럴, 나 또한 쓰기에 선호 if (arr.includes(el)) {}가 명확하고보다 유지 보수 때문에if (arr.indexOf(el) !== -1) {}


1
성능의 차이가 그다지 분명하지 않은 것 같습니다. 내 모바일 Firefox는 indexOf가 실제로 더 빠르다는 것을 보여줍니다. 일부 Chrome 버전은 동일하게 작동합니다.하지만 오늘날의 구현에서는 그 차이가 무시할 만합니다.
Nux

8

.indexOf().includes()메소드를 사용하여 배열의 요소를 검색하거나 주어진 문자열에서 문자 / 하위 문자열을 검색 할 수 있습니다.

배열에서의 사용

( ECMAScript 사양 링크 )

  1. indexOf사용 항등 비교 반면 includes용도 께 SameValueZero의 알고리즘. 이러한 이유로 다음과 같은 두 가지 차이점이 발생합니다.

  2. 에 의해 지적 펠릭스 클링 , 동작은의 경우에는 다르다 NaN.

let arr = [NaN];

arr.indexOf(NaN); // returns -1; meaning NaN is not present
arr.includes(NaN); // returns true
  1. 의 경우에도 동작이 다릅니다 undefined.
let arr = [ , , ];

arr.indexOf(undefined); // returns -1; meaning undefined is not present
arr.includes(undefined); // returns true

문자열에서의 사용법

( ECMAScript 사양 링크 )

  1. RegExp를에 전달하면 RegExp를 indexOf문자열로 취급하고 찾은 경우 문자열의 인덱스를 반환합니다. 그러나 RegExp를에 전달 includes하면 예외가 발생합니다.
let str = "javascript";

str.indexOf(/\w/); // returns -1 even though the elements match the regex because /\w/ is treated as string
str.includes(/\w/); // throws TypeError: First argument to String.prototype.includes must not be a regular expression

공연

으로 538ROMEO는 지적 includes보다 (이 첫 번째 인수로 정규식를 확인하기 위해 필요에 대한) 약간 (아주 작은)는 느린 비트 수 있습니다indexOf 있지만, 현실에서,이 많은 차이를 무시할하지 않습니다.

역사

String.prototype.includes()ECMAScript 2015 Array.prototype.includes()에서 도입 되었지만 ECMAScript 2016에서 도입되었습니다. 브라우저 지원과 관련하여 현명하게 사용하십시오.

String.prototype.indexOf()Array.prototype.indexOf()인 ECMAScript의 ES5 판에 존재하고 따라서 모든 브라우저에서 지원되지 않습니다.


indexOf배열로 true명시 적으로 설정 한 후 제공합니다 undefined. let arr=[undefined];또는 let arr=[];arr[0]=undefined;Nowarr.indexOf(undefined) === 0
Jay Dadhania dec

차이점을 나타내는 유일한 사람은 다음과 undefined같습니다. 그 이유는 .includes누락 된 요소를으로 처리 undefined하고 .indexOf()무시하기 때문입니다. 를 사용하여 누락 된 요소를 "생성"할 수도 있습니다 arr[number beyond length] = whatever.
Robert Siemer

아무도 끈을 요구하지 않았지만 당신의 말은 .includes()끈만 먹는다 는 것을 암시합니다 . 실제로 두 방법 모두 가능한 한 잘 문자열로 강제합니다. 정규식은 특별히하는 인수로 제외 .includes()하는 표준에 향후 추가 허용 현재 초안에 따라.
Robert Siemer

4

개념적으로 indexOf 위치를 사용하려면 indexOf를 사용하여 값을 추출하거나 배열에 대해 작동합니다. 즉, 요소의 위치를 ​​얻은 후 슬라이스, 시프트 또는 분할을 사용합니다. 반면에, Use Array.includes는 값이 배열 내부에 있는지 여부 만 알고 위치는 알지 못합니다.


0

indexOf()그리고 includes()두 배열의 요소를 찾기 위해 사용될 수 있지만, 각 기능은 다른 리턴 값을 산출 할 수있다.

indexOf숫자를 반환합니다 ( -1요소가 배열에 없으면 배열 위치).

includes()부울 값 ( true또는 false)을 반환합니다 .


안녕하세요 Kruti,이 질문은 이미 답변되었으며 수락 된 답변이 있습니다. 또한 귀하의 답변에 다른 답변에서 이미 말한 정보 만 포함되어 있는지 확인할 수 있습니다. 결국 질문은 이미 4 년이되었습니다. 최신 질문 또는 답변되지 않은 질문에 대한 지침을 제공하십시오. 감사합니다
leonardfactory
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.