改变中功能的Chrome中的字符串比较

时间:2014-02-24 22:23:36

标签: 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的一个错误,我提出了一个问题,请参阅下面的答案。

2 个答案:

答案 0 :(得分:1)

进行此更改,问题应该消失:

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

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

但是,我可以在typeof this.data.tab === 'string'子句之前和if之间确认else,所以我认为这只是部分答案。

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

// 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块中的某些内容会改变if检查的行为。我唯一的线索是错误消息的长度很重要。有一段时间,我可以通过改变永远不会抛出的错误消息的长度来清除错误或导致错误。这太奇怪了,我肯定是错的,事实上,我再也无法复制它了。

但是, 大型JavaScript文件。也许有一些东西。也许这只是一个鬼故事。如果没有它,这个问题肯定是非常令人毛骨悚然的,但以防其他人看到类似的东西......你并不孤单。

答案 1 :(得分:1)

我能够创建一个简单的复制案例,因此我提交了bug with Chromium

必要的条件似乎是:setInterval或重复setTimeout,在间隔的主体中进行昂贵的计算,调用新的Object传递包含字符串的数据,以及字符串比较。