为什么Array.prototype.includes.bind表现异常?

时间:2019-07-30 12:27:04

标签: javascript arrays

考虑到function.bind等的现有可谷歌知识以及以下控制代码:

console.log( [1, 2, 3].includes(2) ) // --> `true` 
console.log( [null].map(String.prototype.toUpperCase, "abc") ) // --> `["ABC"]`  
console.log( Array.prototype.includes.bind([3, 4, 5])(1) ) //--> `false`  
console.log( Array.prototype.includes.bind([3, 4, 5])(4) ) // -- > `true`

_是underscorejs,这是一种通用的实用程序包装器/ polyfill物

[1, 2, 3].some(_.prototype.includes.bind(_([3, 4, 5]))) // --> `true`

但是,为什么这段代码会产生这种意外结果?

console.log(
  [1,2,3].some(Array.prototype.includes.bind([3,4,5])) // --> `false`
)

编辑:我知道这段代码的原义形式是错误的形式,但这是POC,实际实现会有所不同(感谢IE,不能使用箭头功能)

2 个答案:

答案 0 :(得分:3)

这是includes的语法:

arr.includes(valueToFind, [fromIndex])

有一个可选的第二个参数fromIndex

  

fromIndex:此数组中开始搜索valueToFind的位置

因此,您的代码将变成这样:

[1,2,3].some((a,index) => Array.prototype.includes.bind([3,4,5])(a, index))
// OR
[1,2,3].some((a, index) => [3,4,5].includes(a, index))

它正在从3开始寻找index = 2

因此,如果要像这样进行更改,它将返回true

console.log(
  // looks for from index=0
  [3,2,1].some(Array.prototype.includes.bind([5,4,3]))
)

答案 1 :(得分:2)

您可能不会期望的是.some()调用带有三个参数的绑定函数,而不仅仅是包含该值的那个。

您可以使用[1,2,3].some(console.log)

进行检查

Array.includes接受两个参数,一个用于该值,另一个用于偏移起始位置。

解决方案是:

[3,2,1].some(n => Array.prototype.includes.bind([5,4,3])(n))