향상된 가독성 외에도 includes
over에 대한 이점이 indexOf
있습니까? 저와 똑같아 보입니다.
이것의 차이점은 무엇입니까
var x = [1,2,3].indexOf(1) > -1; //true
이?
var y = [1,2,3].includes(1); //true
답변
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
NaN
을indexOf
사용하므로 실패합니다[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
일관성을 위해.
추가 정보 :
답변
성능에 대해 궁금하다면 현재 indexOf가 더 빠르지 만이 JSperf 테스트는 시간이 지날 includes()
수록 더 빠를 것임을 보여주는 경향 이 있습니다.indexOf
최적화 될 것 같습니다).
이럴, 나 또한 쓰기에 선호 if (arr.includes(el)) {}
가 명확하고보다 유지 보수 때문에if (arr.indexOf(el) !== -1) {}
답변
.indexOf()
및 .includes()
메소드를 사용하여 배열의 요소를 검색하거나 주어진 문자열에서 문자 / 하위 문자열을 검색 할 수 있습니다.
배열에서의 사용
( ECMAScript 사양 링크 )
-
indexOf
사용 항등 비교 반면includes
용도 께 SameValueZero의 알고리즘. 이러한 이유로 다음과 같은 두 가지 차이점이 발생합니다. -
에 의해 지적 펠릭스 클링 , 동작은의 경우에는 다르다
NaN
.
let arr = [NaN];
arr.indexOf(NaN); // returns -1; meaning NaN is not present
arr.includes(NaN); // returns true
- 의 경우에도 동작이 다릅니다
undefined
.
let arr = [ , , ];
arr.indexOf(undefined); // returns -1; meaning undefined is not present
arr.includes(undefined); // returns true
문자열에서의 사용법
( ECMAScript 사양 링크 )
- 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 위치를 사용하려면 indexOf를 사용하여 값을 추출하거나 배열에 대해 작동합니다. 즉, 요소의 위치를 얻은 후 슬라이스, 시프트 또는 분할을 사용합니다. 반면에, Use Array.includes는 값이 배열 내부에 있는지 여부 만 알고 위치는 알지 못합니다.
답변
indexOf()
그리고 includes()
두 배열의 요소를 찾기 위해 사용될 수 있지만, 각 기능은 다른 리턴 값을 산출 할 수있다.
indexOf
숫자를 반환합니다 ( -1
요소가 배열에 없으면 배열 위치).
includes()
부울 값 ( true
또는 false
)을 반환합니다 .