if语句评估错误

时间:2015-07-27 17:58:25

标签: javascript

function ipsBetween(start, end){
    var count = 0;
    for(var i = 0; i < 4; i++) {
      if(start.split('.').slice(i, i + 1) != end.split('.').slice(i, i + 1)) {
       count++;
      }
    }
    return count;
}

我试图在一个范围之间找到所有可能的IP。上面的代码只是一个开始。我试图将IP拆分并检查它们是否相等。虽然我这样做,但即使值相等,它也会将 if 语句评估为true并增加计数。这是我的测试用例:

  

ipsBetween(“10.0.0.0”,“10.0.0.50”)

这个测试用例返回4,而它应该返回1.我不知道为什么会这样。我看上去很明显的是 start.split('。')。slice(i,i + 1) end.split('。')。slice(i,i + 1)的值)并且前三个元素似乎相等。

3 个答案:

答案 0 :(得分:2)

这里真的没有必要使用.slice()。 (这就是导致问题的原因:.slice()返回一个数组,两个不同的数组永远不会彼此相等。)首先拆分字符串,然后只使用数组索引:

var count = 0;
start = start.split("."); end = end.split(".");
for (var i = 0; i < start.length; ++i)
  if (start[i] != end[i])
    count++;
return count;

答案 1 :(得分:1)

原因是运算符!=在比较两个列表对象时将返回true如果它们不是同一个对象:split返回字符串列表但slice(i, i+1) }将返回长度为1的列表。

这意味着您要将["10"]与另一个["10"]进行比较,它们是两个不同的列表对象,因此!=将返回true。

如果您只是使用x.slice(".")[i]而不是使用slice来比较内容,那么结果就是您所期望的。

PS:Javascript的运算符!=非常糟糕,您不应该使用它而更喜欢!==。在这种情况下它会是相同的,但它更好用,因为当两种类型不同时它不会做疯狂的事情。

PS2:在每次迭代时分割字符串似乎是一个好主意吗?

答案 2 :(得分:0)

您正在比较arrays而不是strings您希望比较string值,请尝试这样做:

function ipsBetween(start, end){
    var count = 0;
    for(var i = 0; i < 4; i++) {
      if(start.split('.').slice(i, i + 1)[0] != end.split('.').slice(i, i + 1)[0]) {
       count++;
      }
    }
    return count;
}
console.log(ipsBetween("10.0.0.0", "10.0.0.50"));

问题是返回的数组对象不会彼此相等,因为它们不是相同的数组即。它们不在记忆中的同一位置......