Гарантируется ли, что map.get(Constants.COUNTRY) всегда будет что-то возвращать?
Чтобы map.get(Constants.COUNTRY)
всегда возвращал исходное значение, должны быть верны несколько вещей.
Вы должны убедиться, что Constants.COUNTRY
никогда нельзя будет присвоить другое значение либо потому, что свойство .COUNTRY
было переназначено, либо потому, что объект Constants
был заменен чем-то другим, имеющим другое значение свойства .COUNTRY
.
Вы должны убедиться, что никто никогда не сможет удалить этот ключ из объекта map
.
Если вы можете гарантировать эти две вещи, то yes map.get(Constants.COUNTRY)
всегда будет возвращать желаемое значение. Но если что-то из этого не обязательно верно, то вы не уверены, что всегда получите свою ценность от карты.
Вы можете гарантировать, что Constants.COUNTRY
нельзя изменить, заморозив объект Constants
или установив для этого свойства возможность настройки, чтобы его нельзя было удалить или записать в него. Чтобы гарантировать, что объект Constants
не может быть заменен, было бы лучше, если бы он был const
, как во втором блоке кода.
Я не знаю способа гарантировать, что никто не сможет вызвать map.delete(Constants.COUNTRY)
, кроме как сохранить объект map
закрытым, чтобы посторонний код не мог получить к нему доступ.
Если у вас есть какая-либо причина, по которой вы хотите предотвратить перечисление ключей на карте (возможно, чтобы кому-то было труднее обнаружить ключ), вы можете использовать WeakMap
вместо Map
.
Является ли производительность такой же хорошей, как использование строк в качестве ключа?
Вам нужно будет протестировать конкретную реализацию Javascript, чтобы быть уверенным в производительности. Нет обязательной причины реализации, по которой тот или иной должен быть быстрее - это просто будет зависеть от внутренних компонентов реализации.
Я создал тестовый пример jsPerf для сравнения поиска строк. для поиска объектов. Приветствуются отзывы об улучшении того, как это тестируется/измеряется, но, используя текущую схему, в которой я создаю 10 000 строковых ключей и 10 000 ключей объектов на карте, а затем сравниваю доступ к 1000 каждого из них, я получаю разные результаты.
Chrome is ~20% slower to access the object keys.
Firefox is ~20% slower to access the string keys.
Edge is ~27% slower to access the string keys.
Также более уместно объявить его как переменную вместо класса?
Как уже говорилось, ваша вторая форма const
имеет то преимущество, что Constants
нельзя переназначить.
person
jfriend00
schedule
21.07.2017
Constants.COUNTRY
никогда не изменится и никто не удалит этот ключ с карты. Статический класс - это просто переменная, ничем не отличающаяся от вашей альтернативы переменнойConstants
. - person jfriend00   schedule 21.07.2017Object.freeze
предотвращает какое-либо изменениеConstants.COUNTRY
, но его можно переназначить для переменной статического класса... поэтому я думаю, что последняя версия объявления его как постоянного объекта лучше, чем объявление его как класса. - person Avery235   schedule 21.07.2017Object.freeze()
предотвращает изменение объекта (что не имеет значения для карты, поскольку это все тот же объект).Object.freeze()
не мешаетConstants.COUNTRY = "hello"
, что имеет значение при доступе кmap.get(Constants.COUNTRY)
. - person jfriend00   schedule 21.07.2017const
) предотвратит изменениеConstants.Country
. Интересно, могли бы выObject.freeze(Constants)
в своем первом примере. - person jfriend00   schedule 21.07.2017Object.freeze(Constants)
предотвратит переназначениеConstants.COUNTRY
, но не переназначениеConstants
. - person Avery235   schedule 21.07.2017Constants
нужно будет объявитьconst
, чтобы предотвратить переназначение, как в вашем втором блоке кода (и как описано в моем ответе). Это пунктconst
, который я полагаю, вы уже знаете. - person jfriend00   schedule 21.07.2017