我遇到了一个有趣的Javascript现象,我无法解释。假设我想将当前时间转换为0.0到23.5之间的值,增量为0.5,即0、0.5、1 1.5…22、22.5、23、23.5
这个代码的作用是:
const dateTimeNow = new Date();
let currentTime = dateTimeNow.getHours();
currentTime += (dateTimeNow.getMinutes() === 30) ? 0.5 : 0;
console.log(currentTime);
但这个单行版本无法产生正确的值:
const dateTimeNow = new Date();
let currentTime = dateTimeNow.getHours() + (dateTimeNow.getMinutes() === 30) ? 0.5 : 0;
console.log(currentTime);
希望有人能解释原因!
原因是运算符的优先级。你的表情:
a + b ? c : d
评估对象:
(a + b) ? c : d
而不是:
a + (b ? c : d)
这是您的三元运算符,您认为操作顺序应该是这样的:
dateTimeNow.getHours() + (dateTimeNow.getMinutes() === 30) ? 0.5 : 0;
dateTimeNow.getHours() + 0.5
20.5
事实上,它是这样做的:
dateTimeNow.getHours() + (dateTimeNow.getMinutes() === 30) ? 0.5 : 0;
20 + true ? 0.5 : 0;
21 ? 0.5 : 0;
0.5;
要解决这个问题,你只需要添加另一组括号:
let currentTime = dateTimeNow.getHours() + ((dateTimeNow.getMinutes() === 30) ? 0.5 : 0);