How do I check if an array includes a value in JavaScript?
Categories:
Checking for Array Inclusion in JavaScript: A Comprehensive Guide

Discover various methods to efficiently determine if an array contains a specific value in JavaScript, covering modern approaches, performance considerations, and best practices.
Determining if an array includes a particular value is a fundamental operation in JavaScript programming. Whether you're validating user input, filtering data, or managing application state, knowing the right method to check for array inclusion is crucial for writing efficient and readable code. This article explores several techniques, from modern built-in methods to traditional loops, discussing their use cases, performance implications, and browser compatibility.
The Modern Approach: Array.prototype.includes()
Introduced in ECMAScript 2016 (ES7), the includes()
method is the most straightforward and recommended way to check for a value's presence in an array. It returns true
if the array contains the specified element, and false
otherwise. Unlike indexOf()
, includes()
correctly handles NaN
values and does not distinguish between +0
and -0
.
const numbers = [1, 2, 3, 4, 5];
const fruits = ['apple', 'banana', 'orange'];
console.log(numbers.includes(3)); // Output: true
console.log(numbers.includes(9)); // Output: false
console.log(fruits.includes('banana')); // Output: true
console.log(fruits.includes('grape')); // Output: false
// Handling NaN
const mixed = [1, NaN, 3];
console.log(mixed.includes(NaN)); // Output: true
// Handling starting index
console.log(numbers.includes(3, 3)); // Output: false (starts search from index 3)
Using Array.prototype.includes()
to check for values.
includes()
for simple value checks due to its readability and correct handling of NaN
and +0/-0
.Traditional Methods: indexOf()
and findIndex()
Before includes()
, indexOf()
was the primary method for checking array inclusion. It returns the first index at which a given element can be found in the array, or -1
if it is not present. findIndex()
is similar but allows you to provide a testing function, making it more flexible for complex object comparisons.
const colors = ['red', 'green', 'blue'];
console.log(colors.indexOf('green')); // Output: 1
console.log(colors.indexOf('yellow')); // Output: -1
// Using findIndex for objects
const users = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' }
];
const hasBob = users.findIndex(user => user.name === 'Bob') !== -1;
console.log(hasBob); // Output: true
const hasCharlie = users.findIndex(user => user.name === 'Charlie') !== -1;
console.log(hasCharlie); // Output: false
Using indexOf()
and findIndex()
for array inclusion checks.
indexOf()
treats NaN
differently. [NaN].indexOf(NaN)
returns -1
, which can lead to unexpected behavior. Use includes()
for NaN
checks.Performance Considerations and Algorithm Flow
Most array inclusion methods, including includes()
, indexOf()
, and findIndex()
, perform a linear search (O(n) time complexity) in the worst case. This means that as the array size grows, the time taken to find an element increases proportionally. For very large arrays or frequent lookups, alternative data structures like Set
or Map
can offer better average-case performance (O(1)).
flowchart TD A[Start] B{Is array empty?} C[Return false] D{Iterate through array elements} E{Current element matches target value?} F[Return true] G[All elements checked?] H[Return false] A --> B B -- Yes --> C B -- No --> D D --> E E -- Yes --> F E -- No --> G G -- No --> D G -- Yes --> H
General algorithm for linear array search (e.g., includes()
).
Optimizing for Frequent Lookups: Using Set
If you need to perform many includes()
checks on the same array, especially if the array is large and its contents don't change frequently, converting it to a Set
can significantly improve performance. Set
objects store unique values and provide an average O(1) time complexity for checking element presence using the has()
method.
const largeArray = Array.from({ length: 100000 }, (_, i) => i);
console.time('array.includes');
largeArray.includes(99999); // Worst case
console.timeEnd('array.includes');
const largeSet = new Set(largeArray);
console.time('set.has');
largeSet.has(99999); // Average case
console.timeEnd('set.has');
// Example with a smaller array
const uniqueItems = ['apple', 'banana', 'orange'];
const itemSet = new Set(uniqueItems);
console.log(itemSet.has('banana')); // Output: true
console.log(itemSet.has('grape')); // Output: false
Comparing performance of includes()
vs. Set.prototype.has()
.
Set
offers better lookup performance, the initial conversion from an array to a Set
takes O(n) time. This optimization is beneficial when you have many lookups after the initial conversion.