• includes方法 使用 Object.defineProperty 扩展 ,解决不兼容问题


    原文链接 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/includes

    includes() 方法用来判断一个数组是否包含一个指定的值,如果是,酌情返回 true或 false。

    let a = [1, 2, 3];
    
    a.includes(2); 
    // true 
    
    a.includes(4); 
    // false

    语法EDIT

    arr.includes(searchElement)
    arr.includes(searchElement, fromIndex)
    

    参数

    searchElement
    需要查找的元素值。
    fromIndex 可选
    从该索引处开始查找 searchElement。如果为负值,则按升序从 array.length + fromIndex 的索引开始搜索。默认为 0。

    返回值

    一个 Boolean

    示例EDIT

    [1, 2, 3].includes(2);     // true
    [1, 2, 3].includes(4);     // false
    [1, 2, 3].includes(3, 3);  // false
    [1, 2, 3].includes(3, -1); // true
    [1, 2, NaN].includes(NaN); // true

    fromIndex 大于等于数组长度

     如果fromIndex 大于等于数组长度 ,则返回 false 。该数组不会被搜索。

    var arr = ['a', 'b', 'c'];
    
    arr.includes('c', 3);   //false
    arr.includes('c', 100); // false

    计算出的索引小于 0

    如果 fromIndex 为负值,计算出的索引将作为开始搜索searchElement的位置。如果计算出的索引小于 0,则整个数组都会被搜索。

    // 数组长度是3
    // fromIndex 是 -100
    // computed index 是 3 + (-100) = -97
    
    var arr = ['a', 'b', 'c'];
    
    arr.includes('a', -100); // true
    arr.includes('b', -100); // true
    arr.includes('c', -100); // true

    includes() 作为一个通用方法

    includes() 方法有意设计为通用方法。它不要求this值是数组对象,所以它可以被用于其他类型的对象 (比如类数组对象)。下面的例子展示了 在函数的arguments对象上调用的includes()方法。

    (function() {
      console.log([].includes.call(arguments, 'a')); // true
      console.log([].includes.call(arguments, 'd')); // false
    })('a','b','c');

    PolyfillEDIT

    // https://tc39.github.io/ecma262/#sec-array.prototype.includes
    if (!Array.prototype.includes) {
      Object.defineProperty(Array.prototype, 'includes', {
        value: function(searchElement, fromIndex) {
    
          // 1. Let O be ? ToObject(this value).
          if (this == null) {
            throw new TypeError('"this" is null or not defined');
          }
    
          var o = Object(this);
    
          // 2. Let len be ? ToLength(? Get(O, "length")).
          var len = o.length >>> 0;
    
          // 3. If len is 0, return false.
          if (len === 0) {
            return false;
          }
    
          // 4. Let n be ? ToInteger(fromIndex).
          //    (If fromIndex is undefined, this step produces the value 0.)
          var n = fromIndex | 0;
    
          // 5. If n ≥ 0, then
          //  a. Let k be n.
          // 6. Else n < 0,
          //  a. Let k be len + n.
          //  b. If k < 0, let k be 0.
          var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
    
          // 7. Repeat, while k < len
          while (k < len) {
            // a. Let elementK be the result of ? Get(O, ! ToString(k)).
            // b. If SameValueZero(searchElement, elementK) is true, return true.
            // c. Increase k by 1.
            // NOTE: === provides the correct "SameValueZero" comparison needed here.
            if (o[k] === searchElement) {
              return true;
            }
            k++;
          }
    
          // 8. Return false
          return false;
        }
      });
    }

    如果你需要支持那些不支持Object.defineProperty的废弃JavaScript 引擎,你最好不要 polyfill Array.prototype 方法,因为你不能使它们不可枚举。

    规范EDIT

    SpecificationStatusComment
    ECMAScript 2016 (ECMA-262)
    Array.prototype.includes
    Standard Initial definition.
    ECMAScript Latest Draft (ECMA-262)
    Array.prototype.includes
    Draft  

    浏览器兼容性EDIT

    FeatureChromeFirefox (Gecko)Internet ExplorerEdgeOperaSafari
    Basic support

    47

    43 (43) 未实现 14 34 9
  • 相关阅读:
    android滤镜效果
    Android ListView的OnItemClickListener详解
    Categories
    利用Stack倒序List,利用Set使List不能添加重复元素
    IOS数据类型对应输出格式
    win7的dropbox无法启动 重新安装也没用
    记一次datatable的删除操作
    winform动态创建radio以及使用委托判断哪个选中
    临时表列的长度
    退出winform应用程序
  • 原文地址:https://www.cnblogs.com/liujinyu/p/7227849.html
Copyright © 2020-2023  润新知