jjzjj

javascript - 将零视为真值的模式

coder 2025-03-01 原文

我经常做这样的事情:

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/

有关javascript - 将零视为真值的模式的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  4. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  5. ruby-on-rails - ruby 日期方程不返回预期的真值 - 2

    为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998

  6. ruby-on-rails - environment.rb 中设置的常量在开发模式中消失 - 2

    了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl

  7. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  8. Ruby:标准递归模式 - 2

    我经常迷上ruby​​的一件事是递归模式。例如,假设我有一个数组,它可能包含无限深度的数组作为元素。所以,例如:my_array=[1,[2,3,[4,5,[6,7]]]]我想创建一个方法,可以将数组展平为[1,2,3,4,5,6,7]。我知道.flatten可以完成这项工作,但这个问题是作为我经常遇到的递归问题的一个例子-因此我试图找到一个更可重用的解决方案。简而言之-我猜这种事情有一个标准模式,但我想不出任何特别优雅的东西。任何想法表示赞赏 最佳答案 递归是一种方法,它不依赖于语言。您在编写算法时要考虑两种情况:再次调用函数的情

  9. ruby - 在 Ruby 中查找多个正则表达式匹配的模式和位置 - 2

    这应该是一个简单的问题,但我找不到任何相关信息。给定一个Ruby中的正则表达式,对于每个匹配项,我需要检索匹配的模式$1、$2,但我还需要匹配位置。我知道=~运算符为我提供了第一个匹配项的位置,而string.scan(/regex/)为我提供了所有匹配模式。如果可能,我需要在同一步骤中获得两个结果。 最佳答案 MatchDatastring.scan(regex)do$1#Patternatfirstposition$2#Patternatsecondposition$~.offset(1)#Startingandendingpo

  10. ruby - sinatra 框架的 MVC 模式 - 2

    我想开始使用“Sinatra”框架进行编码,但我找不到该框架的“MVC”模式。是“MVC-Sinatra”模式或框架吗? 最佳答案 您可能想查看Padrino这是一个围绕Sinatra构建的框架,可为您的项目提供更“类似Rails”的感觉,但没有那么多隐藏的魔法。这是使用Sinatra可以做什么的一个很好的例子。虽然如果您需要开始使用这很好,但我个人建议您将它用作学习工具,以对您来说最有意义的方式使用Sinatra构建您自己的应用程序。写一些测试/期望,写一些代码,通过测试-重复:)至于ORM,你还应该结帐Sequel其中(imho

随机推荐