2016-08-01 53 views
1

我一直在调试这个小时无济于事。为什么这个调用导致无限循环的简单帮助函数?

下面的代码检查在一系列数字中的每个数字是否不具有重复的数字(111应返回false; 123应返回true),并在不含有重复的数字系列返回的所有数字的阵列。

该数组应该填充帮助器函数为阵列中的每个值返回true的值,但运行noRepeats()会导致无限循环或1的长阵列。这是什么造成的?

// DO NOT RUN AS IS; POTENTIAL INFINITE LOOP 
 

 
var noRepeatDigits = function (n) { 
 
    n = n.toString(); 
 
    for (i = 0 ; i < n.length ; i ++) { 
 
    for (j = i + 1 ; j < n.length ; j ++) { 
 
     if (n.charAt(i) === n.charAt(j)) { 
 
     return false; 
 
     } 
 
    } 
 
    } 
 
    return true; 
 
}; 
 

 
console.log(noRepeatDigits(113)); // false 
 
console.log(noRepeatDigits(123)); // true 
 

 
var noRepeats = function (n1, n2) { 
 
    var arr = []; 
 
    for (i = n1 ; i <= n2 ; i ++) { 
 
    if (noRepeatDigits(i)) { 
 
     arr.push(i); 
 
    } 
 
    } 
 
    return arr; 
 
}; 
 

 
console.log(noRepeats(1, 100));

+2

嘛。设置一个断点并调试您的代码。 – Tomalak

回答

4

你忘了var i,所以迭代器是全球性的,并用它相互覆盖这两种功能。这最多会导致意外的行为,最坏的情况是无限循环。

但是您可以简化noRepeatDigits功能很多:

noRepeatDigits = function(n) { 
    return !n.toString().match(/(.).*?\1/); 
}; 

这有效地做你原来的功能做了什么,而是卸载繁重的工作,以内置,较低级别的功能,这一般来说是显著快。

+0

用'var i'声明'i'作为局部变量解决了我的问题,谢谢。使用正则表达式匹配确实可以简化事情。 – JBeck

2

这是黑暗的Absol的答案的插件。

正如他指出的那样,意外行为是由循环中使用的变量引起的。我会建议你把"use strict";提示放在你的Javascript的顶部。这样你就不会再犯同样的错误了。

实施例:

"use strict"; 
// DO NOT RUN AS IS; POTENTIAL INFINITE LOOP 

var noRepeatDigits = function (n) { 
    n = n.toString(); 
    for (i = 0 ; i < n.length ; i ++) { 
     for (var j = i + 1 ; j < n.length ; j ++) { 
      if (n.charAt(i) === n.charAt(j)) { 
       return false; 
      } 
     } 
    } 
    return true; 
}; 

引用: 转换成错误的错误

严格模式改变一些以前接受的错误变为错误。 JavaScript被设计为对新手开发者来说很容易,并且 有时它给出的操作应该是非错误的错误 语义。有时候这会解决眼前的问题,但有时候这会在未来造成更严重的问题。严格模式将这些 错误视为错误,以便它们被发现并及时修复。

首先,严格模式使得不可能无意中创建全局变量 。在正常的JavaScript中,如果忽略赋值 中的变量,将会在全局对象上创建一个新属性,并继续“工作” (尽管将来可能会失败:可能在现代JavaScript中)。 分配这将意外地而不是扔在严格模式 创建全局变量:

参见:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

+0

@JamesBecker你也许对此感兴趣。 –

+0

我需要有人告诉我这一点。我知道“严格使用”,但我知道没有人实现它。也许我应该找到更好的朋友。谢谢! – JBeck

相关问题