【问题标题】:Regexp showing unexpected Type error in javascript正则表达式在 javascript 中显示意外的类型错误
【发布时间】:2012-09-14 05:08:49
【问题描述】:

这很奇怪,不知道为什么会发生,但就是这样。 当我这样做时:

/^\d+$/.test('16')

它工作正常。但是当我执行以下操作时,会出现错误

var t = /^\d+$/.test;
t('16');

我得到的错误是这样的:

TypeError:方法 RegExp.prototype.test 在不兼容的接收器 [object Window] 上调用

我不知道它和这里的 Window 有什么关系....有什么想法吗?

【问题讨论】:

    标签: javascript regex typeerror


    【解决方案1】:

    当您执行/^\d+$/.test('16') 时,您正在调用test 函数,您的正则表达式作为this 对象(即作为对象上的方法调用)。

    当您运行t(16) 时,您没有指定对象,因此this 默认为顶部对象,即window

    要复制第一个行为,您必须这样做:

    var r = /^\d+$/;
    var t = r.test;
    t.call(r, 16);
    

    【讨论】:

      【解决方案2】:

      或者,您可以使用bind 创建一个使用正则表达式作为this 的新函数:

      var r = /^\d+$/;
      var t = r.test.bind(r)
      t(16)
      

      【讨论】:

      • 完美,如果您尝试将正则表达式测试传递到回调中,这就是您想要的
      【解决方案3】:

      当我想通过匹配正则表达式的东西过滤数组时,我看到了这个问题,并使用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']
      

      【讨论】:

        猜你喜欢
        • 2015-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-19
        • 1970-01-01
        • 2016-06-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多