• 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 不会改变原数组。

    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

    类似&&和||的关系
  • 相关阅读:
    Educational Codeforces Round 97 (Rated for Div. 2)
    2020 计蒜之道 线上决赛
    kuangbin 莫队专题
    Codeforces Round #677 (Div. 3)
    Codeforces Round #674 (Div. 3)
    Elasticsearch Alias:别名
    Elasticsearch 集群重要配置的修改
    Elasticsearch文档版本冲突原理与解决
    redis操作详情
    对密码必须包含字母,数字,特殊字符正则表达式理解
  • 原文地址:https://www.cnblogs.com/leejersey/p/5483247.html
Copyright © 2020-2023  润新知