【问题标题】:Greater than returns wrong value on numbers lower then 100大于对小于 100 的数字返回错误值
【发布时间】:2015-11-03 17:31:26
【问题描述】:

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

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

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

将滑块向右移动,然后缓慢向左移动,您会看到它返回“true”,直到达到 100。从那里返回“false”

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;
  }
}
}

【问题讨论】:

  • 您确定要比较的值都是数字吗?这可能是类型不匹配问题——将字符串与数字进行比较。尝试将这两个值包装在 Number() 函数中,看看响应是否改变。
  • 您的 JSBin 失败并显示 "ReferenceError: getSliderInput is not defined at onload (https://null.jsbin.com/runner:1:162) at https://static.jsbin.com/js/prod/runner-3.35.3.min.js:1:13627 at https://static.jsbin.com/js/prod/runner-3.35.3.min.js:1:10537" 在任何情况下,应尽可能在现场使用 Stack Snippes(&lt;&gt; 按钮)提供现场示例。
  • 代替this.value,使用parseInt(this.value, 10) 确保值字符串被转换为数字!
  • JSBin 不适合你们吗?我已经在几个浏览器中对其进行了测试,并且在这里运行良好。
  • @HenrikMadsen:Linux 上的 Chrome 46.0.2490.80 不适合我(见上文)。

标签: javascript


【解决方案1】:

value 上的input 元素始终是一个字符串。虽然最初这不是问题,但当您将this.value 与您放入数组中的100 进行比较时,您然后将this.value 按原样推入数组中(作为字符串)。这意味着稍后,您将最终将该存储的字符串与另一个 this.value 值进行比较,该值也是一个字符串。如果&gt; 的任一操作数是数字,它将强制另一个操作数为数字(+ 的方式,见下文),但如果 both 操作数都是字符串,它将执行词法运算比较,不是数字,"100" 确实是&lt; "99" 因为"1"&lt; "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 为前缀的字符串视为@ 987654345@(因为它停在第一个无效字符处)

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

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

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 2015-01-12
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多