Должен ли я использовать пустой ключ свойства?
Я тестировал это только в Firefox, но, видимо, вы можете использовать пустую строку как ключ к свойству в объекте. Например, см. Первое свойство здесь:
var countsByStatus = {
"": 23, //unknown status
"started": 45,
"draft": 3,
"accepted": 23,
"hold": 2345,
"fixed": 2,
"published": 345
}
При просмотре спецификаций EcmaScript появляется (по крайней мере, в 5), ключи свойств определяются как строки, а строки - 0 или более символов. Это означает, что пустая строка является допустимым именем свойства в соответствии со спецификациями.
В любом случае, у меня возникает соблазн использовать это в разделе кода, где я вычисляю резюме некоторых значений по статусу элемента данных (аналогично тому, что я показал выше). Есть некоторые элементы, которые могут не иметь статуса, и мне нужен заполнитель для них. Поскольку статусы определяются пользователем, я не хочу рисковать использованием фиктивного слова, которое может конфликтовать.
Кажется, так просто и элегантно, глядя на данные, я могу легко сказать, что означала бы пустая строка. Это также делает код немного более эффективным, поскольку пустая строка будет точным значением статуса в элементах без статуса.
Но в то же время мои инстинкты говорят мне, что с этим что-то не так. Я имею в виду, кроме того, что некоторые браузеры могут не поддерживать это, я чувствую, что столкнулся с ошибкой в JavaScript, которая будет исправлена однажды. Но, в то же время, такое же чувство, что у меня когда-то было много других функций JavaScript, которые я сейчас использую каждый день (например, когда я обнаружил, что && и || возвращает значение одного из операндов, а не только true или false).
Ответы
Ответ 1
Ключ объекта должен быть строкой, а пустая строка (''
) - это строка. Нет проблемы с перекрестным браузером, с которой я когда-либо сталкивался с пустыми строками, хотя было очень мало случаев, когда я считал приемлемым использовать пустую строку в качестве имени ключа.
Я бы отказался от общего использования ''
в качестве ключа, но для простого поиска он будет работать нормально и звучит разумно. Это хорошее место, чтобы добавить комментарий, отметив исключительное обстоятельство.
Кроме того, во время поиска у вас могут возникнуть проблемы со значениями, которые передаются в строку:
o = {...} //some object
foo = 'bar';
//some examples
o[foo] //will return o['bar']
o[null] //will return o['null']
o[undefined] //will return o['undefined']
Если вы хотите, чтобы null
и undefined
использовали клавишу ''
, вам может потребоваться резервное копирование:
key = key || '';
Если у вас могут быть нестроковые значения, они также важны:
key = key || '';
key = '' + key;
обратите внимание, что значение 0
превратится в ''
, тогда как значение '0'
останется '0'
.
В большинстве случаев я нахожу, что я выбираю заранее определенное значение из объекта hashtable. Чтобы проверить, существует ли значение для объекта, существует несколько параметров:
//will be falsey if the value is falsey
if (o[key]) {...}
//will return true for properties on the object as well as in the prototype hierarchy
if (key in o) {...}
//returns true only for properties on the object instance
if (o.hasOwnProperty(key)) {...}
Ответ 2
Технически, нет ничего плохого, и вы можете использовать его на любом js-движке (о котором я знаю). Поскольку спецификация ECMAscripts говорит, что любой ключ объекта является строкой, он, конечно, также может быть пустой строкой.
Единственное предостережение в том, что вы никогда не сможете получить доступ к этому свойству с помощью точечной нотации
countsByStatus.;
приведет к синтаксической ошибке, конечно, поэтому всегда должно быть
countsByStatus[''];
Вот о технической части. Если мы поговорим об удобной части, я проголосую за очень четкую не, никогда не использую ее.
Это приведет к путанице, и, как мы все знаем, путаница - это враг.
Ответ 3
Проблема заключается в том, что поскольку статусы определяются пользователем, ничто не мешает пользователю использовать пустую строку как статус, тем самым разрушая вашу логику. С этой точки зрения то, что вы делаете, ничем не отличается, просто используя уродливое пользовательское имя, например __$$unknown_status
. (Хорошо, я бы сказал, что уродливое пользовательское имя более наглядное, но для каждого из них...)
Если вы хотите быть уверенным, что свойство "unknown" не сталкивается, вам нужно сохранить его отдельно:
var counts = {
unknownStatus: 23,
byStatus: {
"": 17, //actual status with no name, (if this makes sense)
"started": 45,
"draft": 3,
"accepted": 23,
"hold": 2345,
"fixed": 2,
"published": 345
}
};
Ответ 4
Думаю, все в порядке. ""
имеет семантику в вашем приложении и ее действительный javascript. Так что на нем.
Обратите внимание, что
x."" = 2;
выйдет ошибка, поэтому вам нужно использовать синтаксис, например
x[""] = 2;
Ответ 5
Является ли "неизвестный статус" нулевым значением или ваше поле статуса "не равно нулю"?
В первом случае я бы сказал, что вам нужно будет использовать отдельный счетчик, во втором я бы сказал, что "пустой" является совершенно допустимым статусом - просто используйте слово "unknown" для вывода вместо ", Это может привести только к путанице, когда ваш пользователь использует то же слово, что и тип состояния, но для предотвращения того, что вы можете использовать другой визуальный стиль для вывода текста" неизвестного состояния".