【问题标题】:Why doesn't this work in JavaScript: line === '}'为什么这在 JavaScript 中不起作用:line === '}'
【发布时间】:2017-09-09 17:32:22
【问题描述】:

我确定这是一个非常基本的问题,但我已经寻找了很多答案,但还是找不到。

我要做的就是查看数组中的元素是否匹配}(即右大括号)。但这不起作用:line === '}'。

我可以使用line.match(/^\}$/)(我正在这样做)。

猜想这与大括号是特殊字符有关,但如果它们用引号引起来,那又有什么关系呢?为什么我不能只引用一个标点符号?

更新:呃,对不起,我不知道这是怎么发生的。我向上帝发誓,我在发布之前仔细测试了它,但现在我的代码可以在 line == "}"、line === "}"、line == '}' 和 line === '}' 上正常工作。在我的轻微辩护中,我唯一可以说的是,我在函数中遇到了多个问题,我认为这仍然是一个问题。不是。问题都在其他地方。

更新 2:既然人们在问,这里是周围的功能。其目的是遍历包含 JavaScript 文件行的数组,并复制传递函数的文本。该代码假定一个函数在发现“}”时复制结束......这就是我测试它的原因。调用此代码时,我不断收到undefined,当我切换到正则表达式时,我确实让它工作了。但显然我在尝试使用正则表达式的同时解决了这个问题。教训是认真地测试,一次只尝试一件事:

// Return an array containing the text of the input function.
function load_function_text(funShun) {
  // Iterate through the present JS file's text.
  var line_num = 0; // Track line num so you can grab the previous line.
  var current_function = [];
  var copying_lines = false;
  this_file.forEach(function(line) {
    // Start copying when 'function funShun' is spotted. (Start pushing from previous line.)
    if (line.match("function " + funShun)) {
      current_function.push(this_file[line_num - 1]);
      current_function.push(line);
      copying_lines = true;
      line_num += 1;
    // Stop copying and return when '}' is spotted.
    } else if (copying_lines && line === "}") {
      // Add this line.
      current_function.push(line);
      // Stop copying when end of function is reached.
      copying_lines = false;
    } else {
      if (copying_lines) current_function.push(line);
      line_num += 1;
    }
  });
  return current_function;
}

更新 3:事实证明我最初的问题实际上是合法的。然而,这是一个 Windows 换行问题。在准备迭代的this_file 数组的Ajax 处理函数中,我将responseText 拆分为\n;但是 .js 文件是在 Windows 中创建的,所以它的换行符都是\r\n。啊!

这就是为什么我的控制台报告整行是},但实际上,我正在使用的整行是}\r。我从来没有匹配过,所以line.match(/^}$/) 可能是真的,而 `line === '}' 可能是假的!结果,我想要为真的某个条件总是为假,所以脚本总是复制到文件的末尾,而不是在我想要复制的位的末尾停止。 (这是点击“查看”时弹出的代码。)

我一开始在“\r\n”上进行拆分,它就在 Windows 中完美运行。然后我发现它在 Heroku 上不起作用,所以我想出了如何做得更好:this_file = xhr.responseText.match(/[^\r?\n]+/g);。

Heroku here,repo here。感谢您的耐心等待。

【问题讨论】:

  • 您能给我们看一个更完整的代码示例吗? (见minimal reproducible example)
  • @anomeric 无需在字符串中转义该字符。
  • 为了娱乐和运动,试试line.trim() === "}" (但是正则表达式也不应该工作) ?
  • 同样,无法复制-> jsfiddle.net/mq58bxth
  • line === '}' 工作得很好。

标签: javascript regex punctuation


【解决方案1】:

您是否尝试过这样做:

line == '}'

另外:我也测试了:

line === '}'

而且效果很好! 阅读上面的cmets!

试试这个也像 Slai 的另一个答案一样?

 line = new String('}')
console.log(line === '}') // 假
console.log(line == '}') // 真
console.log(/^\}$/.test(line)) // true 

JSFIDDLE 演示:https://jsfiddle.net/hanstavo/ck443sbn/

【讨论】:

  • 其实......是的,我很困惑......但问题与我想象的不同。请参阅上面的更新 3。
【解决方案2】:

=== 比较类型,因此如果line 与'}' 的类型不同,则结果为false:

line = ['}']

console.log(line === '}')       // false
console.log(line == '}')        // true
console.log(/^\}$/.test(line))  // true

console.log(typeof line)        // object
console.log(typeof '}')         // string

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2011-10-22
    相关资源
    最近更新 更多