【问题标题】:Same input, different output in JavaScript?JavaScript中相同的输入,不同的输出?
【发布时间】:2012-09-08 21:40:21
【问题描述】:

我现在正在重写我的一个脚本,但遇到了一个我无法弄清楚的问题。 command 是一个输入变量,现在我已经运行了这个测试(两个正则表达式相同):

var parts = command.match(/([^\s"]+(?=\s*|$))|(".+?")/g);
console.log(command === "view -10 10 -10 10");
console.log(parts);
console.log(String("view -10 10 -10 10").match(/([^\s"]+(?=\s*|$))|(".+?")/g));

控制台现在显示

true
[]
["view", "-10", "10", "-10", "10"]

这完全让我感到困惑。为什么command 不以相同的方式分隔,即使使用=== 等于我的测试字符串?

【问题讨论】:

  • 我在 Chrome 中尝试了您的示例,它按预期工作。你用的是哪个浏览器?
  • 您可能想查看命令是否按预期填充。是异步的吗?它是服务器端的还是面向用户的?
  • 可能是范围问题???
  • 我建议你在回答中解释一下,然后接受你的回答。这可能会对其他人有所帮助。
  • @Ingo dystroy 为您添加了解决方案,如果您可以将其标记为“已接受”,那就太好了。

标签: javascript variables


【解决方案1】:

来自 OP

这是整个问题的解决方案: 程序的基本结构如下

while (<condition>) {
    var command = getNextCommand();

    var parts = command.match(/([^\s"]+(?=\s*|$))|(".+?")/g);
    processParts(parts);
}

其中processParts() 操纵了参数:

function processParts(parts) {
    var foo = parts.shift();
    doSomethingElse(foo);
}

这导致主程序中的parts 缩小,在我的代码中processParts 实际上shifted 所有元素,导致console.log(parts) 写入一个空数组,因为它被延迟记录(参见dystroy 的评论)。

最重要的是,我的processParts() 函数有一个我没有注意到的错误,这就是我指责空的parts 的原因。在修复了这个错误之后,上面的代码再次起作用了,因为我不再需要parts 并且可以忍受它已经缩小了。不过,一般来说,您可能需要注意这一点……JavaScript 会做一些奇怪的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多