【问题标题】:Dynamic typing in JavaScript: Is this a good idea?JavaScript 中的动态类型:这是个好主意吗?
【发布时间】:2016-02-05 05:19:11
【问题描述】:

直到最近,我才用 JavaScript 等动态类型语言编写了大量代码,现在我开始了解什么是可能的,我开始想知道什么是好主意,什么不是。具体来说,我不确定在函数通过一系列操作进行时更改变量的类型是否被认为是好的做法。

例如,我有一堆包含日期字符串的文件。我正在使用front-matter 提取日期属性并将它们存储在代表原始文件的对象中。字符串本身不是很一致,所以我使用 Moment.js 来解析它们,并将结果存储在同一对象 article.date 的同一属性中。这对我来说或多或少是正确的,因为article.date 在被解析和存储为日期/“时刻”类型之前只是一个操作的字符串。

接下来是我有点不确定的部分。这是 ExpressJS 应用程序的一部分,因此这些对象的数组在 render() 调用中作为数据传入,并在其中转到 Jade 模板进行渲染。但是如果我想在 Moment.js 中使用显示方法来控制日期显示为字符串的方式怎么办?在传入之前将日期属性的类型再次更改回字符串是否合理?

例子:

articles[i] = processArticle(content); 
// creates an article object from YAML, object has a property article.attributes.date
articles[i].attributes.date = moment(articles[i].attributes.date); 
// attribute is now a Date/Moment
articles[i].attributes.date = articles[i].attributes.date.format("dddd, MMMM Do YYYY, h:mm:ss a");
// attribute is now "Sunday, February 14th 2010, 3:25:50 pm"

【问题讨论】:

  • 我不希望这样做。如果你写一些其他的中间方法,你怎么知道attributes.date 是不是一个字符串?我不喜欢匈牙利符号,但在这种情况下,我会调用一个 dateString 和另一个 datemoment
  • 一些挑剔 :-) 变量和属性没有类型,值有。在这里,您处理的是对象属性,而不是变量。您可能会考虑一个额外的属性,例如 dateString,它是您的格式化字符串。从字符串转换为日期并按顺序转换回来的最大问题是性能(浪费的周期)以及您是否始终如一地解析和格式化字符串而不更改它所代表的值。只有你知道答案。 ;-)
  • @RobG 对不起,noob counter-nitpick/question:这是因为我们在谈论动态类型语言吗?即变量/属性没有类型,因为它可以包含任何类型的 value?或者这是一个基本概念?我正在考虑如何在静态类型语言中 int foo = 100foo 声明为 int,然后为其分配一个值(最好是 int,否则)

标签: javascript node.js momentjs dynamic-typing


【解决方案1】:

我们甚至有类型安全的原因是在早期发现代码中的错误:防止无效的内存访问/非法操作/等。在面向对象的语言中允许解耦和代码重用(多态性)。不仅仅是为了让你作为程序员的生活更加困难,而是为了确保你的程序能够运行。

因为 JavaScript 不提供类型安全,所以这取决于程序员。 必须确保对变量的操作是有效的,并且不会导致导致程序停止运行的异常。 必须确保可以在任何对象上调用方法调用。

所以回答你的问题:不,随着函数的进行更改变量的类型不是一个好习惯。

在您的 Jade 模板中使用 Moment.js:How do I display todays date in Node.js Jade?

【讨论】:

  • 确认一下,这是否意味着 #{articles.attribute.date.format("dddd, MMMM Do YYYY, h:mm a")} 将重新格式化时刻日期以在渲染时显示从 Jade 模板中?我一直将所有逻辑都保留在 JS 方面,只是将字符串传递给 jam 以插入模板,因为我对 JS 比对 jam 更有信心,这似乎是最明智的分工。
  • 是的。我会考虑更好地在模板中进行格式化:在 JS 中,您对对象(例如时刻对象)感兴趣,而不是它们的显示/输出表示。然而,在 Jade 模板中,您是,因此格式属于那里。
  • 我需要做一些特别的事情才能从玉模板中访问 moment.js 吗?或者它是否在我没有任何干预的情况下查看了事物的快递方面的 app.locals?您的链接暗示了后者,但我认为 Jade 不会那么紧密集成,我认为我正在学习给予 Jade 更多的信任。
  • 按照说明将其添加到 app.locals 就足够了,请参阅 express docMaking use of utility libraries in server-side Jade templates。你可以给翡翠信用。模板引擎也可以是一个有价值的工具!
猜你喜欢
  • 2016-06-20
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 2011-05-14
  • 1970-01-01
  • 2014-09-26
相关资源
最近更新 更多