Просто прочитайте this highly-related question, а затем отразите, что я использовал в своей собственной базе кода для проекта на работе.Практика кодирования Javascript: пустые значения в объектах
Я написал простую функцию, чтобы продемонстрировать этот вопрос (с помощью Google Apps Script, таким образом вызовов Logger.log()
):
function emptyValueTest() {
var object = {
prop1: "real_data",
prop2: "",
prop3: undefined,
prop4: null
}
// What I have used in my code personally. All evaluate to TRUE
if (object.prop2 === "") Logger.log("prop2 was empty");
if (typeof object.prop3 === "undefined") Logger.log("prop3 was undefined");
if (object.prop4 === null) Logger.log("prop4 was null");
// The other solution I've seen. All evaluate to FALSE
if (object.prop2) Logger.log("prop2 was empty");
if (object.prop3) Logger.log("prop3 was undefined");
if (object.prop4) Logger.log("prop4 was null");
}
Я строил систему в течение последних нескольких месяцев с тысячами строк кода, и я часто обнаруживаю обратное отслеживание, когда вижу конкретное значение, чтобы помнить, что это было предыдущее состояние, до определенного условного выражения.
Поскольку я один пишет код, это не слишком трудно для меня, чтобы понять это, потому что я знаю структуру данных, значение, которые должны быть там, и т.д.
Однако после того, как я окончу свой университет, эта система будет перехвачена другим разработчиком, поэтому я задаюсь вопросом, какая наилучшая практика для , представляющая, что свойство не имеет данных.
Например, мой вариант использования: event
Объекты, которые инициализируются пустыми данными и, в течение всего срока службы семестра, в конечном итоге заполняются реальными данными. Лично я использую undefined
, потому что для меня имеет смысл читать if (typeof data === "undefined")
, имея сходное семантическое значение «если эти данные не определены» (т. Е. Нет значения еще).
Но интересно, в промышленности, в библиотеках и в личных проектах, какие обычно используемые методы делают код более читабельным, понятным? Хотя длина первых трех условных чисел длиннее последних трех, я считаю, что последние три были неоднозначными.
Например, prop2
может иметь непустое строку как "data"
или значение true
, которое вызвало бы последний условный if (object.prop2)
оценить, true
в обоих случаях, потому что все в JavaScript является truthy за исключением следующего:
- нуль
- неопределенному
- NaN
- пустая строка ("")
- ложные
И это вполне возможно, что данные могут иметь ""
, 0
и false
, как действительные значения, в то время как null
, undefined
и (особенно) NaN
, вероятно, не являются типичными значениями для реальных данных.
Очевидно, что я мы знаем, что структура данных, то мы могли бы ввести более строгие проверки на неоднозначность непустых строк из истинного.Но в проекте с тысячами строк кода мне кажется, что это быстро выходит из-под контроля, особенно если структура данных изменяется с течением времени.
Так что мой вопрос: Есть ли предпочтительный способ представляющего пустых значения в Javascript? И есть ли конкретная причина предпочтения (производительность, читаемость, масштабируемость и т. Д.)?
Вероятно, это делом вкуса, но лично я бы использовать 'null', чтобы легко различать свойства, которые не были определены по сравнению с теми, которые еще не использовались или не были установлены. «NaN» может возникнуть из-за некоторых ошибок в математике, которые не сработают, и было бы гораздо труднее сказать, откуда она (потому что это будет считаться пустой). Кроме того, добавленный бонус заключается в том, что 'null' может возникнуть только в том случае, если вы либо назначили переменную для свойства, которое уже является null, либо напрямую присвоено значение null. Вы не можете получить нуль другим способом (кроме, вероятно, через 'eval ('null')', но это так маловероятно). –
Согласен, это может быть вопрос мнения, например, я уже выразил свое собственное! Однако, я думаю, что здесь есть другие вещи. Например, некоторые операции возвращают нулевые значения, если они не удалось/данные не могут быть найдены: 'var split =" some ",. Split (", ")'; значение в 'split [1]' будет 'null', что в зависимости от системы может быть допустимым значением. Вот почему я склоняюсь к 'undefined', потому что семантически это имеет больше смысла, и вероятность случайного столкновения меньше, чем в примере, который я только что дал. Интересно, если это консенсус, хотя ... –
@ChrisCirefice На самом деле 'split [1] === undefined'. В любом случае, я бы тоже использовал «нуль». 'undefined' используется для * свойств *, которые не определены. Но эти свойства действительно определены ... без ценности. Тогда вы должны использовать 'null', так как это его точное значение. – MaxArt