---
type: reference
language: javascript
slug: array/every-some
title: "every() と some() — 全部か、1つでもあるか"
title_tag: "JavaScript の every() と some() — 違いと空配列の罠"
summary: >
  every() は全部が満たすか、some() は1つでも満たすかを true / false で返します。
  空配列で答えが逆になること、途中で止まること、includes() との使い分けまで実行して確かめます。
description: >
  空の配列に every() を使うと true、some() は false になります。この差が原因の不具合は
  実際に起きます。短絡して止まる仕組みや includes() との使い分けまで実行して確かめられます。
status: published
difficulty: 1
minutes: 7

versions:
  verified: "Node 22.22.3"
  since: "ES5"
  deprecated: null
  removed: null

sources:
  - title: "Array.prototype.every — ECMAScript® 2026 Language Specification"
    url: "https://tc39.es/ecma262/#sec-array.prototype.every"
  - title: "Array.prototype.some — ECMAScript® 2026 Language Specification"
    url: "https://tc39.es/ecma262/#sec-array.prototype.some"
  - title: "Array.prototype.every() — MDN"
    url: "https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/every"

terms: [述語, 短絡評価, 真偽値]

links:
  related:
    - javascript/reference/array/filter
    - javascript/reference/array/find
    - javascript/reference/array/includes

content_updated_at: 2026-09-08
published_at: 2026-09-08
---

どちらも**返るのは `true` か `false` だけ**です。要素は返りません。

```js run
const nums = [2, 4, 6];

console.log(nums.every((n) => n % 2 === 0));
console.log(nums.some((n) => n > 5));
console.log(nums.every((n) => n > 5));
console.log(nums.some((n) => n > 99));
```
```output
true
true
false
false
```

| 使うもの | 意味 | 日本語にすると |
|---|---|---|
| `every()` | **全部**が満たす | 「すべて〜である」 |
| `some()` | **1つでも**満たす | 「〜が1つでもある」 |

## いちばんの落とし穴：空の配列

```js run
console.log([].every((n) => n > 0));
console.log([].some((n) => n > 0));
console.log([].every(() => false));
```
```output
true
false
true
```

**空の配列に `every()` を使うと、いつでも `true` です。**
条件の中身は[em:1度も呼ばれません]。

これは間違いではなく、[key:反例が1つも無い]という意味です。
数学の「すべての〜」と同じ決まりで、[type:空虚な真]と呼ばれます。

事故になるのはこういう形です。

```js bad
function canSubmit(errors) {
  return errors.every((error) => error.level === 'warn');
}

console.log(canSubmit([{ level: 'warn' }]));
console.log(canSubmit([]));
```
```output
true
true
```

読み込みに失敗して `errors` が空だったときも `true` になります。
**「空かどうか」は別に確かめてください。**

```js run
function canSubmit(errors) {
  return errors.length > 0 && errors.every((error) => error.level === 'warn');
}

console.log(canSubmit([{ level: 'warn' }]));
console.log(canSubmit([]));
```
```output
true
false
```

[dim:「空なら通す」が正しい場面もあります。決めるのは仕様であって、既定の挙動ではありません。]

## 答えが出たところで止まる

```js run
const seen = [];

[1, 2, 3, 4].every((n) => {
  seen.push(n);
  return n < 2;
});

console.log('every が見たもの:', seen.join(','));

const seen2 = [];

[1, 2, 3, 4].some((n) => {
  seen2.push(n);
  return n > 2;
});

console.log('some が見たもの:', seen2.join(','));
```
```output
every が見たもの: 1,2
some が見たもの: 1,2,3
```

- `every()` … **最初の `false` で止まる**
- `some()` … **最初の `true` で止まる**

重い判定を書いても、全部は走りません。
[dim:逆に言うと、条件の中で全要素に副作用を起こす書き方は壊れます。数を数えたいなら `filter().length` を使ってください。]

## `includes()` との使い分け

```js run
const list = [{ id: 1 }, { id: 2 }];

console.log(list.includes({ id: 1 }));
console.log(list.some((item) => item.id === 1));
```
```output
false
true
```

`includes()` が見るのは[key:同じ値かどうか]です。
見た目が同じでも、[bad:別に作ったオブジェクトは一致しません。]

**中身の条件で探すなら `some()`** です。
→ [includes() / indexOf()](/ja/javascript/reference/array/includes/)

## 似ているものとの違い

| 欲しいもの | 使うもの | 返るもの |
|---|---|---|
| 全部が条件を満たすか | `every()` | `true` / `false` |
| 1つでもあるか | `some()` | `true` / `false` |
| **その要素** が欲しい | `find()` | 要素 or `undefined` |
| 条件に合うもの**全部** | `filter()` | 配列 |
| 何件あるか | `filter().length` | 数 |

「あるかどうか」だけ知りたいのに `filter()` を書くと、
**要らない配列を作ってから捨てる**ことになります。

```js run
const nums = [1, 2, 3];

console.log(nums.filter((n) => n > 2).length > 0);
console.log(nums.some((n) => n > 2));
```
```output
true
true
```

答えは同じですが、`some()` は[key:見つかった時点で止まります]。

## 返す値は真偽値でなくてよい

```js run
console.log([1, 2].every((n) => n));
console.log([0, 1].every((n) => n));
console.log([{}, []].some((v) => v));
console.log([''].some((v) => v));
```
```output
true
false
true
false
```

返した値は[key:真偽値として見られます]。
空のオブジェクトや空の配列は `true` 側、`0` と空文字は `false` 側です。
→ [なぜ === を使うのか](/ja/javascript/why/strict-equality/)

## よくある間違い：非同期の条件を渡す

```js bad
const check = async (n) => n > 100;

console.log([1, 2, 3].every(check));
console.log([1, 2, 3].some(check));
console.log(typeof check(1));
```
```output
true
true
object
```

**どちらも `true` です。中身は1つも 100 を超えていません。**

`async` を付けた関数が返すのは `Promise` です。
`Promise` は[bad:必ず真]なので、`every()` は全部通り、`some()` は最初で止まります。
[em:`await` を書く場所がありません。]

先に全部走らせて、結果の配列で判定してください。

```js run
const check = async (n) => n > 100;

const results = await Promise.all([1, 2, 3].map(check));

console.log(results);
console.log(results.every(Boolean), results.some(Boolean));
```
```output
[ false, false, false ]
false false
```

→ [複数の非同期処理を同時に走らせる](/ja/javascript/how-to/async/parallel/)

## オブジェクトに使うとき

`every()` と `some()` は配列のものです。
オブジェクトなら、いったん配列にしてください。

```js run
const form = { name: 'あ', email: '' };

console.log(Object.values(form).every((value) => value !== ''));
console.log(Object.entries(form).filter(([, value]) => value === '').map(([key]) => key));
```
```output
false
[ 'email' ]
```

**「揃っているか」だけなら `every()`、「どれが足りないか」なら `filter()`** です。
→ [Object.keys() / values() / entries()](/ja/javascript/reference/object/keys/)

## 条件には3つ渡ってくる

```js run
['a', 'b'].every((value, index, array) => {
  console.log(value, index, array.length);
  return true;
});
```
```output
a 0 2
b 1 2
```

使わない引数は書かなくて構いません。

## 穴のある配列では呼ばれない

```js run
const holed = [1, , 3];
const seen = [];

holed.every((n) => {
  seen.push(n);
  return true;
});

console.log(seen.length, JSON.stringify(seen));
console.log(holed.some((n) => n === undefined));
```
```output
2 [1,3]
false
```

`length` は3ですが、**条件は2回しか呼ばれません。**
`undefined` が入っているのとは違います。
→ [配列の穴](/ja/javascript/reference/array/find/)

## まとめ

- 返るのは `true` / `false` だけ。**要素は返らない**
- **空の配列で `every()` は `true`、`some()` は `false`**
- `every()` は最初の `false`、`some()` は最初の `true` で止まる
- 中身の条件で「あるか」を見るなら[key:includes ではなく some]
- 要素そのものが欲しいなら `find()`、全部欲しいなら `filter()`
- 穴のある配列では**条件が呼ばれない**
- **`async` の条件は必ず `true` になる。** `Promise.all()` で先に走らせる
