javascript - 一个奇怪的 moment.js 事情

标签 javascript momentjs

所以我在 if 语句中有这段代码如下

if (!inTime || !moment(inTime).format('m') % 15 === 0) {
doSomething();
}

传入的 inTime 是 2018-10-11T20:00:25Z。由于某种原因,满足了条件并且正在调用 if block 中的代码。经过一些工具后,我发现了两个问题的修复,如下所示

if (!inTime || !(moment(inTime).format('m') % 15 === 0)) {
doSomething();
}

*注意 bang 之后和 0 之后的括号 或者我可以这样做

if (!inTime || !moment(inTime).minute() % 15 === 0) {
doSomething();
}

我很好奇有没有人知道为什么会这样?

最佳答案

表达式

!moment(inTime).format('m') % 15 === 0

被解释为好像是写的

((!moment(inTime).format('m')) % 15) === 0

所以它的评估过程如下

  1. moment(inTime).format('m') 给出字符串“0”
  2. !moment(inTime).format('m') 给出 bool 值 false,因为“0”为真
  3. ((!moment(inTime).format('m')) % 15)给出数字0,false转换为数字后(0) 并计算模数
  4. ((!moment(inTime).format('m')) % 15) === 0 给出 true

tl;dr ! 绑定(bind)得非常紧密。

由于您有一个 ISO 日期字符串,因此使用 native Date API 可能会更简单:

if (!inTime || new Date(inTime).getMinutes() % 15 !== 0)

关于javascript - 一个奇怪的 moment.js 事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52769861/

相关文章:

javascript - 鼠标悬停在图像的特定部分时图像发生变化

javascript - 函数中的参数包含表达式吗?

javascript - 清除具有特定前缀的本地存储值

vue.js - 时刻 JS + Vue JS : Getting Relative Time From Now To A Certain Point In The Past

javascript - 使用 setValue angular 4 时,错误在位置 0 处缺少数字

javascript - 如何根据网格线的宽度在带有 alpha channel 的 Canvas 中绘制网格?

javascript - 在 Controller 之间共享数据,AngularJS

javascript - MongoDB + JS 日期移动-1 天

javascript - 今天的日期 : Moment construction falls back to js Date

javascript - 通过使用 moment javascript 我只需要添加小时数(不增加或添加分钟数)/四舍五入到最近的小时或月份或年份