dje*_*lin 5 javascript node.js
我经常做这样的事情:
delay = delay || 24; // default delay of 24 hours
Run Code Online (Sandbox Code Playgroud)
但我实际上想要允许0,而0 || 24 === 24不是0.
我想知道最好的模式是从命令行获取用户输入,或者从哪里输入,并执行相同的逻辑,只将零视为真实.我认为我发现的最佳模式就是这样做:
delay = (delay === 0 ? delay : (delay || 24));
Run Code Online (Sandbox Code Playgroud)
首先,它允许这样的事情'abc',这是非常错误的.但是如果我早点放进+去就可以null滑过,这也是错误的.其次,非常难看,因为它明显地解决了语言缺陷,而不是使用可用的语言工具做一些优雅的事情.而且不是非常可读.我正在做一些思路,我想在一个实际的代码行中做这件事(在技术性方面不是一行,就像这样).但是我得到的大多数其他想法都变得更加丑陋:
delay = typeof delay === 'number' ? delay : 24; // but typeof NaN === 'number', so
delay = (!isNaN(delay) && typeof delay === 'number') ? delay : 24;
Run Code Online (Sandbox Code Playgroud)
请注意,这实际上适用于字符串 - 如果我有兴趣接受"",那么
str = typeof str === 'string' ? str : 'default';
Run Code Online (Sandbox Code Playgroud)
由于没有NaN漏洞,这是智能可读的:如果我们有一个字符串使用,否则使用defaut.
或者这条路线:
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
Run Code Online (Sandbox Code Playgroud)
所以我仍然更喜欢我的hacky三元和布尔逻辑.是的,我正在寻找一个简洁的单行解决方案,因为JS充满了模式,而且许多其他语言中的聪明之处在JS中得到了广泛的认可和可读性.但我是新手,并试图学习好的模式,因此,这个问题.
更明确的要求:
0需要去0.undefined需要去24.typeof需要自己去,除了NaN.null应该去,24因为我很少使用JS代码来处理null和undefined故意.我觉得保持这种方式更好.NaN应该去,24因为这更紧密地遵循||模式.虚假的东西应该是默认的.'abc' 应该转到24 - 在我的真实应用程序中这是用户输入,并且用户不应该错误地键入,比如电子邮件.'123abc'理想情况下应该转向24哪种转换为Number捕获而parseInt不是转换.我相信电子邮件可以从数字开始,所以这就推动了这一点,这应该是应该抓住的.可以接受下划线或者lodash答案, 特别是对于那些在试图"聪明"而不是编写2-3行功能的情况下教我的人.这些库的存在正是因为有许多简单的2-3行函数在世界各地的许多代码库中的许多地方完成同样的事情,并且它具有更高的可读性和可维护性以及将它们隔离为类似的东西_.readNumber.如果不存在这样的方法并且我能够提出足够的要求,我将自己提交一个民意调查请求并将其作为对此问题的答案发布.这是我喜欢JS的东西 - 它有很好的生态系统,因为它很可能没有必须写这些实用方法.由于我特别处理用户输入,因此我可能更好地编写一个稍微更专业的函数并提交给commander.js,这是我一直需要它的地方.
假设用户输入像一些评论所说的那样,那么它以任何可能的字符串开始,所以不妨测试它。
delay = /^(\d+)$/.exec( delay ) ? Number( RegExp.$1 ) : 24;
Run Code Online (Sandbox Code Playgroud)
请注意,这还可以防止负整数,尽管没有作为要求给出,但作为时间延迟是没有意义的。