javascript - Chrome 中的字符串比较改变了中间功能

标签 javascript google-chrome

我在 Chrome v.33 中遇到了一个完全奇怪的问题,看起来好像字符串比较运算符已损坏。它仅在开发人员工具关闭时发生。我有以下功能:

function TabSelected(data) {
  var tab, was_design;
  this.data = data;
  tab = this.data.tab;
  was_design = tab === 'design';
  if (this.data.tab === 'design') {
    this.tab = 1;
  } else {
    this.tab = 2;
    console.log('was_design');
    console.log(was_design);
    console.log('is_design');
    console.log(tab === 'design');
  }
}

我这样称呼:

new TabSelected({
    tab: 'design'
  });

我有一个 setInterval 正在运行,每 50 毫秒运行一次此代码。大多数情况下,if 语句会选择第一个代码路径,因此控制台不会记录任何内容。然而,大约 8 秒后,它会进入 else 代码路径。当我随后打开开发人员工具时(因为关闭它们时不会发生错误),我看到以下日志输出:

was_design (index):96624
false (index):96625
is_design (index):96626
true (index):96627

我……对此感到困惑。我还尝试记录 tab 的内容,这实际上是“设计”,并记录 this,这是一个新的 TabSelected 实例。

我是不是疯了? Chrome 是否失去了理智?

更新:我能够在简化的设置中重现它:http://jsfiddle.net/WBpLG/24/ 。我很确定这是 Chrome 的一个错误,我已经提交了一个问题,请参阅下面的答案。

最佳答案

进行此更改,问题就会消失:

if (this.data.tab === 'design') {

if (String(this.data.tab) === 'design') {

但是,我可以确认typeof this.data.tab === 'string'两者都在 if 之前条款和else期间,所以我认为这充其量只是部分答案。

或者,我也可以通过调整NewElementButtonSectionOpened.prototype.previous_requirement来解决这个问题。第 59440 行:

// Create a single instance of the requirement and store it in the closure.
var cachedReq = new TabSelected({ tab: 'design' });

// Now just return that one instance over and over again.
NewElementButtonSectionOpened.prototype.previous_requirement = function() {
  // deleted line: return new TabSelected({ tab: 'design' });
  return cachedReq;
};

虽然这两种解决方案都解决了我机器上的问题,但我不清楚为什么这有效。

我不敢提及这一点,但在某一时刻,我还能够通过添加 throw new Error("..."); 来防止错误发生。在你的 else 中堵塞。换句话说,改变 else 中的某些内容 block 改变了 if 的行为查看。我唯一的线索是错误消息的长度很重要。有一段时间,我可以通过改变永远不会抛出的错误消息的长度来清除错误或一致地导致错误。这太奇怪了,我一定是弄错了,而且事实上,我再也无法复制它了。

但是,这个是一个非常大的JavaScript文件。也许这其中有什么道理。也许这只是一个鬼故事。如果没有它,这个问题肯定已经足够令人毛骨悚然了,但以防万一其他人看到类似的东西......你并不孤单。

关于javascript - Chrome 中的字符串比较改变了中间功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22000430/

相关文章:

javascript - 如何在 jQuery 中获取具有特定 ValidationGroup 的文本框?

html - Chrome、Flexbox 和 fat div

css - drupal 7 chrome 不加载 css 规则

javascript - .addClass 不会覆盖 native 单元格背景颜色

javascript - 谷歌饼图 : How can I remove the white line between slices?

css - 默认视点有很大差异

angularjs - Protractor 无法使用 directConnect 运行

google-chrome - 如何防止 chrome 在 Linux 上耗尽我的内存和交换空间?

javascript - 声明没有值的变量

javascript - 将隐藏值调用到 highchart