- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚在一些处理 RegExp.test
的 javascript 代码中发现了最奇怪的错误。我在一个函数中声明了一个正则表达式 regexp
并且我有一个引用了 regexp
的闭包并且我使用闭包迭代一个字符串数组来测试他们在来自 prototype.js 的 collect
的帮助下,即
function some_func() {
var regexp = /regular_expression/;
an_array_of_strings.collect(
function(str) {
if (regexp.test(str)) {
do_something();
}
}
);
}
真正奇怪的是,在闭包内调用 regexp.test(str)
会在同一输入上的 true
和 false
之间交替.我查看了 RegExp.test
的源代码,没有发现任何可疑之处,但确实存在一些问题,因为相同的字符串如何通过相同的正则表达式并使其失败。在进一步查看 RegExp.test
之后,我基本上得出结论,在 RegExp.test
中声明的变量在两次调用之间继续存在,并扰乱了后续调用。所以问题来了:
this.a = 2;
和
var a = 2;
当上述语句出现在一个方法中时,该方法正在一个对象上调用,该对象位于一个包含对该对象的引用的闭包中?我问是因为当我将 regexp.test
移到闭包之外时,错误就消失了。当在闭包外调用 regexp.test
时,它不会在每次调用时在 true
和 false
之间切换。我不知道为什么会这样。
编辑:当我将 regexp
移到闭包之外时,我忘记添加全局选项,这就是错误消失的原因。谢谢Ivo .
最佳答案
由于您没有显示您的 RegExp 但我只是回答了类似的问题,我想您在 RegExp 中使用了 global
选项,这会产生一些有趣的副作用。
As with exec (or in combination with it), test called multiple times on the same global regular expression instance will advance past the previous match.
来源:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/test
所以这里到底发生了什么,因为你正在使用正则表达式的全局选项,它会在找到匹配项后继续搜索字符串。
regexp.test("d")
这会在位置 0 找到 d。
regexp.test("d")
现在将从位置 1 开始搜索 d,但由于这是字符串的末尾,因此它不会找到任何内容,因此返回 false。
我们可以使用正则表达式的 lastIndex
属性来证明:
regexp.lastIndex
>> 0
regexp.test("d")
>> true
regexp.lastIndex
>> 1
regexp.test("d")
>> false
因此,要解决此问题,您需要从 RegExp 中删除 global
选项。
免责声明,这是我之前回答的副本:
Unusual javascript Regex result, explanation please!
关于javascript - 'var a = 2' 和 'this.a = 2' 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4204647/
这个问题已经有答案了: Can I bind an array to an IN() condition in a PDO query? (23 个回答) 已关闭 5 年前。 任何人都可以看到我如何在
我阅读了关于此的 bash 手册页,但我不明白其中的区别。我对它们进行了测试,它们似乎产生了完全相同的结果。 如果值不是通过命令行参数设置的,我想设置一个变量的默认值。 #!/bin/bash var
我为我的网站开了一家商店,并让它运行起来,但我意识到它无法正确购买商品。换句话说,您不会走进一家商店,拿起一件商品,购买,再次购买,购买,再次购买,等等,以获得想要的数量。你一次捕获他们。我的网站缺少
基本上,我想知道为什么会这样(将列表的内存地址作为参数传递): void init_lista (elemPtr *list) { *list = NULL; } int main(){
看到这个问题:Is there a (built-in) way in JavaScript to check if a string is a valid number?还有这个:jsperf ,其
我有以下字符串: 我想用正则表达式替换所有后面有 px 的数字,并用 X 乘以它们的值。 (X 是一个变量)。 所以如果X=3,结果就是 请注意 X 必须是我将检索到函数的变量 最佳答案 以下代码
这个问题在这里已经有了答案: 关闭 13 年前。 同时 (var != var) System.out.println("循环.."); 执行它..如何声明..var
我只是好奇。我想知道表达式是否有特定原因 var &= expr 行为方式与不同 var = var && expr. 看起来第一个表达式中的表达式正在执行,而不管 var 上的 false 值。 我
我有这个 Ruby 代码: var1 = 10 puts var1.object_id var1 = var1 + 0 puts var1.object_id var1 = var1 + 1 puts
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: demote boost::function to a plain function pointer 所以我
好吧,堆栈溢出, 我花了几个小时来解决 javascript 中的问题(在 NodeJS 服务器中编写),但我真的不明白。 这就是发生的事情: var data = {x: 50}; var temp
首先,我在这里处理 1 和 0,我很清楚 1 == true 和 0 == false。但是我很好奇为什么这不起作用: $var = 1; echo $var; /* 1 */ $var = $var
标题说的是什么:将变量封装在 {}、"" 或 "{}"中是什么意思?我无法在网上找到关于此的任何解释 - 除了使用不会产生任何结果的符号外,我无法引用它们。 这是一个例子: declare -a gr
我需要将信息发送到我的 Html。例如 $(document).ready(function() { var = "'#"+result.tag+"'" // var = '#tag_dinamy
是否可能,如果可以,如何将以下表达式转换为一行? DEV=$(lsblk -no KNAME,MODEL | grep 'ModelNAME') DEV=${DEV%%'ModelNAME'} 简单的
isset($var) == "Test" 和 isset($var) && $var == 'Test" 有什么区别? 最佳答案 这里是一个简短的例子: $var = "Chuck Test"; v
isset($var) == "Test" 和 isset($var) && $var == 'Test" 有什么区别? 最佳答案 这里是一个简短的例子: $var = "Chuck Test"; v
如果我有一个字符串:[Object a:var b:var c:var]; 如何将 a:、b: 和 c: 与正则表达式匹配? 我试过:\[.+\s+(.+:).+\] 但它不适用于 a、b 和 c,它
这个问题在这里已经有了答案: Why does this if-statement combining assignment and an equality check return true? (
我正在 Powershell 中使用 SCSM,但遇到了 if 语句的问题。 我有一个函数,它根据作为变量传递给函数的条件收集数据。 例子: $JMLs1 = collectTickets -crit
我是一名优秀的程序员,十分优秀!