不能将String.prototype.match用作Array.some的函数吗?

时间:2015-11-10 05:27:30

标签: 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) }));

这是为什么?我想象String.prototype.match函数太过"原始"什么的,但为什么呢?由于我没有使用ES2015,第二个版本看起来相当冗长。还有其他选择吗?

修改

当我写上面的内容时,实际上我的实际需要与实际需要相比,它实际上需要将一个字符串与一些正则表达式相匹配。但是由于下面的答案和评论很好,我明白了:[/^foo/, /^boo/].some(''.match, 'boot')

2 个答案:

答案 0 :(得分:6)

注意: this的值取决于函数如何调用! (例外:绑定和箭头功能)

如果您将s.match传递给.some,则会调用该函数,并将this设置为全局对象(例如window)而不是字符串&#34} ;属于"到。

即。它等同于:

String.prototype.match.call(window, 'foo')

这不起作用,因为this必须引用字符串对象。

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

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

详细了解this

答案 1 :(得分:4)

Javascript中的函数值不会带来它的对象。 s.match的值是一个普通函数值,不知道您碰巧发现它附加到s。事实上,无论你通过什么字符串访问它,它始终是相同的函数值:

"foo".match === "bar".match 
//= true

当您通过对象调用函数时,Javascript会在函数调用期间将this设置为该对象。但是只要在检索函数值和调用它之间发生任何事情,就会丢失任何对象关联。

您可以使用this创建一个 记住特定bind值的功能,就像@Felix King的回答一样。 someFunction.bind(someObject)function(arg1, arg2,...) { return someObject.someFunction(arg1, arg2,...); }具有大致相同的含义,但它会自动正确处理参数数量。