Array.prototype.every()

Метод every() перевіряє, чи всі елементи масиву відповідають умові, що задана функцією, яка передається як аргумент. Повертає булеве значення.

function isBigEnough(element, index, array) { 
  return element >= 10; 
} 

[12, 5, 8, 130, 44].every(isBigEnough);   // false 
[12, 54, 18, 130, 44].every(isBigEnough); // true

Синтаксис

arr.every(callback(element[, index[, array]])[, thisArg])

Параметри

callback
Функція, яка перевіряє кожен елемент масиву. Приймає три аргументи:
element
Поточний елемент, який обробляється в масиві.
index Optional
Індекс поточного елемента, який обробляється в масиві.
array Optional
Масив для якого був викликаний метод every.
thisArgOptional
Значення, що використовується як this при виконанні callback.

Вертає

true, якщо функція callback повернула правдиве значення для кожного елементу масиву; інакше, false.

Опис

Метод every виконує функцію callback один раз для кожного елементу масиву поки не знайдено хоча б один елемент, функція callback якого повертає хибне значення. Якщо такий елемент знайдено, метод every одразу повертає false. В іншому ж випадку, якщо функція callback повернула правдиве значення для усіх елементів, every повертає true.  Функція callback викликається тільки для тих індексів масиву, які мають присвоєні значення; вона не викликається для тих індексів, котрі були видалені або котрим ніколи не присвоювалися значення.

Функція callback викликається з трьома аргументами: значення елементу, індекс елементу в масиві і масив по якому робиться перебір.

Якщо параметр thisArg переданий в every, то він буде використовуватися функцією callback як значення this, коли та буде викликана. В іншому випадку буде передано значення undefined як її значення this. Значення this зрештою видиме для функції callback і визначається відповідно до звичайних правил для визначення this яке видиме функцією.

Метод every не змінює масив, на якому він був викликаний.

Діапазон елементів, які обробляються методом every() встановлюється перед першим виконанням функції callback. Елементи, які додаються в масив після того, як метод every()був викликаний, не будуть обходитися функцією callback. Якщо існуючі елементи масиву змінилися, то їхні значення, які передаються в функцію callback будуть значеннями на момент обходу їх методом every(); якщо існуючі елементи масиву видалили, то метод every() обходити їх не буде.

Метод every схожий за дією на математичний символ "для кожного \forall \!\,". Зокрема, для порожнього масиву він повертає true. (Всі елементи порожнього набору задовольняють будь-якому заданому стану.)

Приклади

Перевірка значення кожного елементу масиву

Даний приклад перевіряє чи всі елементи масиву більші ніж 10.

function isBigEnough(element, index, array) {
  return element >= 10;
}
[12, 5, 8, 130, 44].every(isBigEnough);   // false
[12, 54, 18, 130, 44].every(isBigEnough); // true

Викристання стрілочних функцій

Стрілочні функції надають коротший синтаксис для такої ж самої перевірки.

[12, 5, 8, 130, 44].every(x => x >= 10); // false
[12, 54, 18, 130, 44].every(x => x >= 10); // true

Поліфіл

Метод every був доданий до ECMA-262 стандарту у 5-ій версії; як такий він може бути не реалізований в усіх реалізаціях стандарту. Ви можете обійти цю проблему, вставивши наступний код на початку ваших скриптів, що дозволить використовувати метод every у тих версіях, які не підтримують його початково. Цей алгоритм є саме тим, що зазначений у  ECMA-262, 5-ій версії, за умови, що Object і TypeError мають свої первинні значення і що callbackfn.call прирівнюється до первинного значення Function.prototype.call

if (!Array.prototype.every) {
  Array.prototype.every = function(callbackfn, thisArg) {
    'use strict';
    var T, k;

    if (this == null) {
      throw new TypeError('this дорівнює null або не визначений');
    }

    // 1. Нехай O буде результатом виклику ToObject з передачею значення
    //    this в якості аргумента.
    var O = Object(this);

    // 2. Нехай lenValue буде результатом виклику внутрішнього метода O
    //    Get з аргументом "length".
    // 3. Нехай len буде результатом ToUint32(lenValue).
    var len = O.length >>> 0;

    // 4. Якщо IsCallable(callbackfn) повертає false, викинути виняток TypeError.
    if (typeof callbackfn !== 'function') {
      throw new TypeError();
    }

    // 5. Якщо thisArg було передано, хай T буде thisArg; інакше хай T буде undefined.
    if (arguments.length > 1) {
      T = thisArg;
    }

    // 6. Нехай k дорівнює 0.
    k = 0;

    // 7. Повторювати, доки k < len
    while (k < len) {

      var kValue;

      // а. Нехай Pk буде ToString(k).
      //   Це неявно для операндів LHS оператора in
      // б. Нехай kPresent буде результатом виклику внутрішнього метода
      //    O HasProperty з аргументом Pk.
      //    Цей крок можна поєднати з в
      // в. Якщо kPresent дорівнює true, тоді
      if (k in O) {

        // i. Нехай kValue буде результатом виклику внутрішнього метода
        //    O Get з аргументом Pk.
        kValue = O[k];

        // ii. Нехай testResult буде результатом виклику внутрішнього метода
        //      callbackfn Call з T в якості значення this і списком аргументів, 
        //      який містить kValue, k, та O.
        var testResult = callbackfn.call(T, kValue, k, O);

        // iii. Якщо ToBoolean(testResult) дорівнює false, повернути false.
        if (!testResult) {
          return false;
        }
      }
      k++;
    }
    return true;
  };
}

Специфікації

Specification Status Comment
ECMAScript 5.1 (ECMA-262)
The definition of 'Array.prototype.every' in that specification.
Standard Початкове визначення. Реалізовано у JavaScript 1.6.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Array.prototype.every' in that specification.
Standard
ECMAScript Latest Draft (ECMA-262)
The definition of 'Array.prototype.every' in that specification.
Draft

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
everyChrome Full support YesEdge Full support 12Firefox Full support 1.5IE Full support 9Opera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Див. також