大于100的数字返回错误值.Javascript

时间:2015-11-03 17:31:26

标签: javascript

这是我的第一个javascript项目,所以我确定这段代码不漂亮,可以用更好的方式编写,但除此之外,我遇到了一个我不明白的问题。我确定这只是我自己造成的一个错误,但我根本找不到它。

'>' (大于)运算符在超过100的数字上工作正常,但在达到100时停止工作。由于某种原因100> 99返回false?

指向jsbin的链接。将滑块向右移动,然后慢慢向左移动,您将看到它返回“true”,直到达到100.从那里返回“false”

https://jsbin.com/vigocu/edit?console,output

function getSliderInput(inputSliderId) {
  var backSwingArray = [100];
  var downSwingArray = [];


  document.querySelector('#' + inputSliderId).addEventListener('input', fillArray , false);

function fillArray() {

  if (isNaN(downSwingArray[downSwingArray.length - 1]) && backSwingArray[backSwingArray.length - 1] < this.value) {
    backSwingArray.push(this.value);
  } else if (downSwingArray[downSwingArray.length - 1] > this.value || isNaN(downSwingArray[downSwingArray.length - 1])){
    console.log('Is ' + downSwingArray[downSwingArray.length - 1] + ' > ' + this.value + ' return ' + (downSwingArray[downSwingArray.length - 1] > this.value));
    downSwingArray.push(this.value);
  } else {
    console.log('Is ' + downSwingArray[downSwingArray.length - 1] + ' > ' + this.value + ' return ' + (downSwingArray[downSwingArray.length - 1] > this.value));
    return;
  }
}
}

1 个答案:

答案 0 :(得分:5)

value元素上的

input始终是字符串。虽然这最初不会成为问题,但当您将this.value与您在数组中放入的100进行比较时,则将this.value推送到数组中-is(作为字符串)。这意味着稍后,您最终会将存储的字符串与另一个this.value值进行比较,该值也是一个字符串。如果>的任一操作数是一个数字,它会将另一个操作数强制转换为数字(+的方式,见下文),但如果两个操作数都是字符串,那么将进行词汇比较,而不是数字比较,而"100"确实是< "99",因为"1"< "9"

因此,您希望尽早将this.value转换为数字,然后在比较和推入阵列时使用该数字。你有很多方法可以做到这一点:

  • 一元+将要求整个字符串为有效数字,但会将""视为0;它还会将以0x开头的字符串视为十六进制

    var num = +this.value;
    // or perhaps
    var num = this.value === "" ? NaN : +this.value;
    // or even
    var str = this.value.trim(); // .trim can be shimmed on obsolete browsers
    var num = str === "" ? NaN : +str;
    
  • parseInt(..., 10)(10指定要使用的基数[数字基数])将允许字符串末尾的垃圾,将""视为NaN,并对待任何以0x为前缀的字符串0(因为它在第一个无效字符处停止)

    var num = parseInt(this.value, 10);
    
  • Number(...)执行+所做的事情

    var num = Number(this.value); // or variations above on +