gpt4 book ai didi

javascript - 将零视为真值的模式

转载 作者:数据小太阳 更新时间:2023-10-29 05:58:19 25 4
gpt4 key购买 nike

我经常做这样的事情:

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 空洞,而且这是智能可读的:如果我们有一个字符串,则使用它,否则使用 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

所以我还是更喜欢我的 hacky 三元和 bool 逻辑。是的,我正在寻找一种简洁的单行解决方案,因为 JS 充满了模式,而在许多其他语言中聪明的东西在 JS 中得到了很好的认可、可读和清晰。但我是新手,正在努力学习好的模式,因此,这个问题。

更明确的要求:

  • 0 需要转到 0
  • undefined 需要转到 24
  • 除了 typeof 之外,NaN 下的所有实际数字都需要转到它们自己。
  • 我强烈认为 null 应该转到 24,因为我很少使用故意区别对待 nullundefined 的 JS 代码。我觉得最好保持这种状态。
  • 我觉得 NaN 应该转到 24,因为这更接近于 || 模式。虚假的东西应该默认。
  • 'abc' 应为 24 - 在我的实际应用程序中,这是用户输入,用户不应错误输入,例如电子邮件。
  • '123abc' 理想情况下应该转到 24 ,转换为 Number 会捕获但 parseInt 不会。我相信电子邮件可以以数字开头,所以这说明了这一点应该被捕获。

下划线或 lodash 答案是可以接受的, 特别是对于那些教我努力变得“聪明”而不是编写 2-3 行函数的人。这些库的存在正是因为有许多简单的 2-3 行函数在世界各地的许多代码库的许多地方完成同样的事情,并且将它们隔离为诸如 _.readNumber 之类的东西更具可读性、可维护性和健壮性.如果不存在这样的方法并且我能够提出足够通用的要求,我将自己提交一个投票请求并将其发布为该问题的答案。这是我喜欢 JS 的地方 - 它具有良好的生态系统,因此很有可能不必编写这些实用方法。因为我特别处理用户输入,所以我最好编写一个稍微更专业的函数并提交给 commander.js,这是我一直需要它的地方。

最佳答案

没有提到 int 要求,因此假设您想要任何 数字,否则默认为 24​​,您可以使用此:

delay = isFinite(delay) ? delay : 24;

或者更安全:

delay = isFinite(parseFloat(delay)) ? delay : 24;

或者罗伯特·莱蒙特色菜:

delay = isFinite(parseFloat(delay))|0||24;

当然,让其他人一眼就能理解语句比语法糖更重要。您编写的代码是为了让人和机器都能理解,而不是为了抵御工业 spy 。 p>

关于javascript - 将零视为真值的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17433873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com