考虑到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,不能使用箭头功能)
答案 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))