Array.prototype.every()
概述
every() 方法測試數組的所有元素是否都通過了指定函數的測試。
語法
arr.every(callback[, thisArg])
參數
-
callback - 用來測試每個元素的函數。
-
thisArg -
執行
callback時使用的this值。
描述
every 方法為數組中的每個元素執行一次 callback 函數,直到它找到一個使 callback 返回 false(表示可轉換為布爾值 false 的值)的元素。如果發現了一個這樣的元素,every 方法將會立即返回 false。否則,callback 為每一個元素返回 true,every 就會返回 true。callback 只會為那些已經被賦值的索引調用。不會為那些被刪除或從來沒被賦值的索引調用。
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 返回false。callback 只會在那些”有值“的索引上被調用,不會在那些被刪除或從來未被賦值的索引上調用。
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
類似&&和||的關系
