这是我的第一个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;
}
}
}
答案 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 +