Я до сих пор не делал много кодирования на динамически типизированных языках, таких как JavaScript, и теперь, когда я начинаю понимать, что возможно, я начинаю задаваться вопросом, какая хорошая идея, а что нет. В частности, я не уверен, что пересмотр типа переменной как функции, проходящей через последовательность операций, считается хорошей практикой.Динамическая типизация в JavaScript: Это хорошая идея?
Например, у меня есть куча файлов, содержащих даты в виде строк. Я использую front-matter для извлечения атрибутов даты и их хранения в объекте, представляющем исходный файл. Строки сами по себе не очень согласованы, поэтому я использую Moment.js для их анализа и сохранения результата обратно в том же атрибуте в том же объекте article.date
. Это кажется более или менее правильным для меня, поскольку article.date
является только строкой для одной операции, прежде чем ее разобрать и сохранить в виде типа Дата/«Момент».
Часть, которую я немного не уверен в следующем. Это часть приложения ExpressJS, поэтому массив этих объектов передается как данные в вызове render(), где он переходит к шаблону Jade для рендеринга. Но что, если я хочу использовать метод отображения в Moment.js для управления тем, как дата выглядит как String? Было бы разумным изменить тип атрибута даты обратно на String еще раз, прежде чем передавать его?
Пример:
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» и другую «дату» или «момент». – user949300
Некоторые подборки nit :-) Переменные и свойства не имеют типа, значения имеют значение. Здесь вы имеете дело с свойствами объекта, а не с переменными. Вы можете рассмотреть дополнительное свойство, например * dateString *, это ваша форматированная строка. Самые большие проблемы с преобразованием из строки в дату и обратно последовательно - это производительность (потраченные впустую циклы) и независимо от того, вы последовательно анализируете и форматируете строку без изменения значения, которое она представляет. Только вы знаете ответы. ;-) – RobG
@RobG Извините, noob counter-nitpick/question: Это потому, что мы говорим о динамически типизированном языке? т. е. свойство variable/не имеет типа, поскольку оно может содержать * значение * любого типа? Или это фундаментальная концепция? Я думаю о том, как в статически типизированном языке 'int foo = 100' объявляет' foo' как int, а затем присваивает ему значение (которое лучше было бы int, или еще) – Toadfish