我经常做这样的事情:
delay = delay || 24; // default delay of 24 hours
但我实际上想允许 0 和0 || 24 === 24
,而不是0
。
我想知道最好的模式是从命令行获取用户输入,或者从任何地方输入,并执行相同的逻辑,只将零视为真实。我认为我发现的最佳模式就是这样做:
delay = (delay === 0 ? delay : (delay || 24));
首先,它允许诸如 之类的东西'abc'
,这确实是错误的。但是,如果我提早输入+
,它就会null
滑过,这也是错误的。其次,非常难看,因为它显然是在解决语言缺陷,而不是使用可用的语言工具做一些优雅的事情。而且可读性不强。我正在做的事情是一种思路,我想用一行实际的代码来做(而不是技术性的一行,就像这样)。但我的大多数其他想法变得更加丑陋:
delay = typeof delay === 'number' ? delay : 24; // but typeof NaN === 'number', so
delay = (!isNaN(delay) && typeof delay === 'number') ? delay : 24;
请注意,这实际上适用于字符串 - 如果我有兴趣接受""
,那么
str = typeof str === 'string' ? str : 'default';
因为没有NaN
洞,这是智能可读的:如果我们有一个字符串,使用它,否则使用默认值。
或者这条路线:
delay = !isNaN(+delay) ? delay : 24; // fails on null
delay = !Number.isNaN(+delay) ? delay : 24; // still fails on null
// same thing with null check, now way uglier than we started
所以我还是更喜欢我的 hacky 三元和布尔逻辑。是的,我正在寻找一种简洁的、单行的解决方案,因为 JS 充满了模式,而且在许多其他语言中聪明的东西在 JS 中得到了很好的认可、可读性和清晰性。但我是新手并试图学习好的模式,因此,这个问题。
为了更明确的要求:
0
需要去0
。undefined
需要去24
。- 所有实际数字
typeof
都需要自己去,除了NaN
. - 我强烈觉得
null
应该去,24
因为我很少使用故意区别对待的 JSnull
代码undefined
。我觉得最好保持这种状态。 - 我觉得
NaN
应该去,24
因为这更接近||
模式。虚假的东西应该默认。 'abc'
应该转到 24 - 在我的实际应用程序中,这是用户输入,用户不应该错误地输入,比如电子邮件。'123abc'
理想情况下应该转到24
,转换为Number
捕获但parseInt
没有。我相信电子邮件可以以数字开头,所以这让我们明白这是应该被抓住的东西。
下划线或 lodash 的答案是可以接受的, 特别是对于那些教导我尝试“聪明”而不是编写 2-3 行函数的人。这些库的存在正是因为在世界各地的许多代码库中的许多地方都有许多简单的 2-3 行函数完成相同的事情,并且将它们隔离为诸如_.readNumber
. 如果不存在这样的方法并且我能够提出足够一般的要求,我将自己提交一个投票请求并将其发布为这个问题的答案。这是我喜欢 JS 的一点——它有很好的生态系统,因为它很可能不必须编写这些实用方法。由于我特别处理用户输入,因此编写一个稍微更专业的函数并提交给commander.js 可能会更好,这正是我一直需要的地方。