这很奇怪,不知道为什么会发生,但就是这样。当我这样做时:
/^\d+$/.test('16')
它工作正常。但是当我执行以下操作时,出现错误
var t = /^\d+$/.test;
t('16');
我得到的错误是这样的:
TypeError:在不兼容的接收器 [object Window] 上调用了方法 RegExp.prototype.test
我不知道它与这里的 Window 有什么关系……知道吗?
这很奇怪,不知道为什么会发生,但就是这样。当我这样做时:
/^\d+$/.test('16')
它工作正常。但是当我执行以下操作时,出现错误
var t = /^\d+$/.test;
t('16');
我得到的错误是这样的:
TypeError:在不兼容的接收器 [object Window] 上调用了方法 RegExp.prototype.test
我不知道它与这里的 Window 有什么关系……知道吗?
或者,您可以使用bind创建一个使用正则表达式的新函数this
:
var r = /^\d+$/;
var t = r.test.bind(r)
t(16)
当您这样做时,/^\d+$/.test('16')
您正在test
使用您的正则表达式作为this
对象调用函数(即作为对象上的方法调用)。
运行时,t(16)
您没有指定对象,因此this
默认为顶部对象,即window
.
要复制第一个行为,您必须这样做:
var r = /^\d+$/;
var t = r.test;
t.call(r, 16);
当我想通过匹配正则表达式的东西过滤数组时,我看到了这个问题,并使用以下方法修复它bind
:
var items = ['a', 'b', 'c', 'A'];
var pattern = new RegExp('^a$', 'i');
var matches = items.filter(pattern.test.bind(pattern));
console.log(matches);
结果如下:
['a', 'A']