有关 Array.prototype.includes() 方法的详解

Array.prototype.includes()

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

语法

arr.includes(valueToFind[, fromIndex])

参数

valueToFind
需要查找的元素值。

Note: 使用 includes() 比较字符串和字符时是区分大小写

fromIndex 可选
fromIndex 索引处开始查找 valueToFind。如果为负值,则按升序从 array.length + fromIndex 的索引开始搜 (即使从末尾开始往前跳 fromIndex 的绝对值个索引,然后往后搜寻)。默认为 0

返回值

A Boolean which is true if the value valueToFind is found within the array (or the part of the array indicated by the index fromIndex, if specified). Values of zero are all considered to be equal regardless of sign (that is, -0 is considered to be equal to both 0 and +0), but false is not considered to be the same as 0.

返回一个布尔值 Boolean ,如果在数组中找到了(如果传入了 fromIndex ,表示在 fromIndex 指定的索引范围中找到了)则返回 true

Note: Technically speaking, includes() uses the sameValueZero algorithm to determine whether the given element is found.

示例

	[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

1. fromIndex 大于等于数组长度

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

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

2. 计算出的索引小于 0

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

	// array length is 3
	// fromIndex is -100
	// computed index is 3 + (-100) = -97
	
	var arr = ['a', 'b', 'c'];
	
	arr.includes('a', -100); // true
	arr.includes('b', -100); // true
	arr.includes('c', -100); // true
	arr.includes('a', -2); // false

3. 作为通用方法的 includes()

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

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

Polyfill

	// https://tc39.github.io/ecma262/#sec-array.prototype.includes
	if (!Array.prototype.includes) {
	  Object.defineProperty(Array.prototype, 'includes', {
	    value: function(valueToFind, fromIndex) {
	
	      if (this == null) {
	        throw new TypeError('"this" is null or not defined');
	      }
	
	      // 1. Let O be ? ToObject(this value).
	      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);
	
	      function sameValueZero(x, y) {
	        return x === y || 
	        (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));
	      }
	
	      // 7. Repeat, while k < len
	      while (k < len) {
	        // a. Let elementK be the result of ? Get(O, ! ToString(k)).
	        // b. If SameValueZero(valueToFind, elementK) is true, return true.
	        if (sameValueZero(o[k], valueToFind)) {
	          return true;
	        }
	        // c. Increase k by 1.
	        k++;
	      }
	
	      // 8. Return false
	      return false;
	    }
	  });
	}

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


转载自 MDN Web Docs 的文章 Array.prototype.includes()

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值