Подтвердить что ты не робот

Должен ли я использовать пустой ключ свойства?

Я тестировал это только в 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).

4b9b3361

Ответ 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" для вывода вместо ", Это может привести только к путанице, когда ваш пользователь использует то же слово, что и тип состояния, но для предотвращения того, что вы можете использовать другой визуальный стиль для вывода текста" неизвестного состояния".