ES5 數組方法every和some

Array.prototype.every()

概述

every() 方法測試數組的全部元素是否都經過了指定函數的測試。算法

語法

arr.every(callback[, thisArg])

參數

callback
用來測試每一個元素的函數。
thisArg
執行  callback 時使用的  this 值。

描述

every 方法爲數組中的每一個元素執行一次 callback 函數,直到它找到一個使 callback 返回 false(表示可轉換爲布爾值 false 的值)的元素。若是發現了一個這樣的元素,every 方法將會當即返回 false。不然,callback 爲每個元素返回 trueevery 就會返回 truecallback 只會爲那些已經被賦值的索引調用。不會爲那些被刪除或歷來沒被賦值的索引調用。數組

callback 被調用時傳入三個參數:元素值,元素的索引,原數組。函數

若是爲 every 提供一個 thisArg 參數,在該參數爲調用 callback 時的 this 值。若是省略該參數,則callback 被調用時的 this 值,在非嚴格模式下爲全局對象,在嚴格模式下傳入 undefined測試

every 不會改變原數組。this

every 遍歷的元素範圍在第一次調用 callback 以前就已肯定了。在調用 every 以後添加到數組中的元素不會被 callback 訪問到。若是數組中存在的元素被更改,則他們傳入 callback 的值是 every 訪問到他們那一刻的值。那些被刪除的元素或歷來未被賦值的元素將不會被訪問到。spa

實例

例子:檢測全部數組元素的大小

下例檢測數組中的全部元素是否都大於 10。prototype

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

兼容舊環境(Polyfill)

在第 5 版時,every 被添加進 ECMA-262 標準;所以在某些實現環境中不被支持。你能夠把下面的代碼放到腳本的開頭來解決此問題,該代碼容許在那些沒有原生支持 every 的實現環境中使用它。該算法是 ECMA-262 第5版中指定的算法,假定 Object 和 TypeError 擁有它們的初始值,且 fun.call 等價於Function.prototype.callcode

if (!Array.prototype.every)
{
  Array.prototype.every = function(fun /*, thisArg */)
  {
    'use strict';

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== 'function')
        throw new TypeError();

    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++)
    {
      if (i in t && !fun.call(thisArg, t[i], i, t))
        return false;
    }

    return true;
  };
}

Array.prototype.some()

概述

some() 方法測試數組中的某些元素是否經過了指定函數的測試。對象

語法

arr.some(callback[, thisArg])

參數

callback
用來測試每一個元素的函數。
thisArg
執行 callback 時使用的  this 值。

描述

some 爲數組中的每個元素執行一次 callback 函數,直到找到一個使得 callback 返回一個「真值」(便可轉換爲布爾值 true 的值)。若是找到了這樣一個值,some 將會當即返回 true。不然,some 返回falsecallback 只會在那些」有值「的索引上被調用,不會在那些被刪除或歷來未被賦值的索引上調用。blog

callback 被調用時傳入三個參數:元素的值,元素的索引,被遍歷的數組。

若是爲 some 提供了一個 thisArg 參數,將會把它傳給被調用的 callback,做爲 this 值。不然,在非嚴格模式下將會是全局對象,嚴格模式下是 undefined

some 被調用時不會改變數組。

some 遍歷的元素的範圍在第一次調用 callback. 時就已經肯定了。在調用 some 後被添加到數組中的值不會被callback 訪問到。若是數組中存在且還未被訪問到的元素被 callback 改變了,則其傳遞給 callback 的值是some 訪問到它那一刻的值。

示例

例子:測試數組元素的值

下面的例子檢測在數組中是否有元素大於 10。

function isBigEnough(element, index, array) {
  return (element >= 10);
}
var passed = [2, 5, 8, 1, 4].some(isBigEnough);
// passed is false
passed = [12, 5, 8, 1, 4].some(isBigEnough);
// passed is true

兼容舊環境(Polyfill)

在第 5 版時,some 被添加進 ECMA-262 標準;這樣致使某些實現環境可能不支持它。你能夠把下面的代碼插入到腳本的開頭來解決此問題,從而容許在那些沒有原生支持它的實現環境中使用它。該算法是 ECMA-262 第 5 版中指定的算法,假定 Object 和 TypeError 擁有他們的初始值,且 fun.call 等價於 Function.prototype.call

if (!Array.prototype.some)
{
  Array.prototype.some = function(fun /*, thisArg */)
  {
    'use strict';

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== 'function')
      throw new TypeError();

    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++)
    {
      if (i in t && fun.call(thisArg, t[i], i, t))
        return true;
    }

    return false;
  };
}

總結:

方法區別

every() 每一項都返回true才返回true
some() 只要有一項返回true就返回true相似&&和||的關係
相關文章
相關標籤/搜索