为什么这不适用于JavaScript:line ==='}'

时间:2017-09-09 17:32:22

标签: javascript regex punctuation

我确定这是一个非常基本的问题,但我已经找到了相当多的答案,我无法找到它。

我想要做的就是查看数组中的元素是否与}匹配(即右括号)。但这不起作用: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 ==='}'!因此,我想要成为某个条件的某个条件始终为false,因此脚本始终复制到文件的末尾,而不是在我想要复制的位的末尾停止。 (这是您单击"查看"时弹出的代码。)

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

Heroku hererepo here。谢谢你的耐心等待。

2 个答案:

答案 0 :(得分:0)

===会比较各种类型,因此如果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

答案 1 :(得分:0)

您是否尝试过这样做:

line == '}'

另外:我也测试过:

line === '}'

它工作正常! 阅读以上评论!

在Slai的另一个答案中也尝试这个吗?

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

JSFIDDLE DEMO:https://jsfiddle.net/hanstavo/ck443sbn/