ES5 數組方法every和some

摘自: https://www.cnblogs.com/leejersey/p/5483247.html

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 不會改變原數組。

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

實例

例子:檢測所有數組元素的大小

下例檢測數組中的所有元素是否都大於 10。

 

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.call

 

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 只會在那些”有值“的索引上被調用,不會在那些被刪除或從來未被賦值的索引上調用。

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

類似&&和||的關係
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章