Javascript Can';t使用String.prototype.match作为数组的函数。一些?

Javascript Can';t使用String.prototype.match作为数组的函数。一些?,javascript,arrays,Javascript,Arrays,这不起作用: var s = '^foo'; console.log(['boot', 'foot'].some(s.match)); Uncaught TypeError: String.prototype.match called on null or undefined 但这确实: var s = '^foo'; console.log(['boot', 'foot'].some(function(i) { return i.match(s) })); 为什么会这样?我想,Strin

这不起作用:

var s = '^foo';
console.log(['boot', 'foot'].some(s.match));

Uncaught TypeError: String.prototype.match called on null or undefined
但这确实:

var s = '^foo';
console.log(['boot', 'foot'].some(function(i) { return i.match(s) }));
为什么会这样?我想,
String.prototype.match
函数可能太“原始”了,但确切的原因是什么?因为我没有使用ES2015,所以第二个版本看起来相当冗长。还有别的选择吗

编辑


当我写上面的内容时,我实际上是将它与我的实际需要(将一个字符串与多个正则表达式相匹配)进行了反向比较。但是由于下面的回答和评论,我明白了:
[/^foo/,/^boo/].some('.match,'boot')
注意:此的值由函数的调用方式决定!(例外:绑定和箭头函数)

如果将
s.match
传递给
.some
,则调用函数时,将
设置为全局对象(例如
窗口
),而不是它“所属”的字符串

也就是说,它相当于:

String.prototype.match.call(window, 'foo')
这无法工作,因为此必须引用字符串对象

您可以通过将函数绑定到特定的
this
值来解决此问题:

['boot', 'foot'].some(s.match.bind(s));

了解有关此的更多信息:


Javascript中的函数值不带对象。
s.match
的值是一个普通函数值,您不知道它是否附加到了
s
。事实上,无论您通过哪个字符串访问它,它始终是相同的函数值:

"foo".match === "bar".match 
//= true
当您通过对象调用函数时,Javascript会在函数调用期间将该对象设置为
this
。但是一旦在检索函数值和调用函数值之间发生任何事情,任何对象关联都将丢失


您可以使用
bind
创建一个确实记住特定
值的函数,如@Felix King的答案所示
someFunction.bind(someObject)
function(arg1,arg2,…){return someObject.someFunction(arg1,arg2,…);}
的含义大致相同,但它会自动正确处理参数的数量。

您的意思是
i.match(s)
?其实这并不重要。
['boot','foot'].some(/./.test,/^foo/)
在regexp上运行正常,它可以传递给some(),而在
[].some()
回调上没有包装器,就不能调用基于每项字符串的match()方法。因此,如果您使用
“”.match()
过滤/some/every
,只需使用
/.test()
将regexp模式作为第二个参数传递给数组方法。@dandavis这很有趣,为什么不回答这个问题呢?结果相同,但您也可以参考字符串原型上的函数:
['boot','foot'].some(String.prototype.match.bind));
对我来说似乎更“纯粹”,但谁知道呢。