Есть ли способ использовать константы в JavaScript ?
Если нет, какова общая практика определения переменных, которые используются в качестве констант?
javascript
constants
fuentesjr
источник
источник
Chrome
позволяет использовать ключевое словоconst
для использования констант. напримерconst ASDF = "asdf"
. Однако, посколькуconst
он не совместим с несколькими браузерами, я обычно придерживаюсьvar
декларации.try{const thing=1091;}catch(e){var thing=1091;}
работает.const
илиvar
вообще?const
имеет ту же область видимостиvar
, что и уровень функции, а не уровень блока. Если вы будете следовать следующему стандарту ECMAScript, он будетconst
иметь ту же область действияlet
, что означает, что он не будет работать.Ответы:
Начиная с ES2015 , JavaScript имеет понятие
const
:Это будет работать практически во всех браузерах, кроме IE 8, 9 и 10 . Некоторым также может потребоваться строгий режим .
Вы можете использовать
var
с соглашениями, такими как ALL_CAPS, чтобы показать, что определенные значения не должны быть изменены, если вам нужно поддерживать старые браузеры или работать с устаревшим кодом:источник
const
ключевое слово. В настоящее время поддерживается всеми современными браузерами, кроме IE.Object.defineProperty
для создания свойств только для чтения, которые также не могут быть удалены. Это работает в текущей версии всех основных браузеров (но неправильно в IE8 ). Смотрите ответ @NotANameconst
Ключевое слово теперь официально является частью языка и поддерживается каждым браузером. По данным statcounter.com, лишь несколько процентов интернет-пользователей все еще используют старые версии браузеров, которые не поддерживаютconst
.Вы пытаетесь защитить переменные от модификации? Если это так, то вы можете использовать шаблон модуля:
Используя этот подход, значения не могут быть изменены. Но вы должны использовать метод get () для CONFIG :(.
Если вам не нужно строго защищать значение переменных, просто сделайте, как предлагается, и используйте соглашение ALL CAPS.
источник
CONFIG.get = someNewFunctionThatBreaksTheCode
... В общем, вы абсолютно не можете применять константы в JS (без ключевого слова const). Единственное, что вы можете сделать, это ограничить видимость.private
это будущее зарезервированное слово в JavaScript, я бы не использовал его на вашем месте.const
Ключевое слово в проекте ECMAScript 6 , но при этом он пользуется пока только небольшим количеством поддержки браузера: http://kangax.github.io/compat-table/es6/ . Синтаксис:источник
const
, оно не выдаст никаких ошибок. Присвоение просто не выполняется, и константа все еще имеет свое первоначальное значение. Это главный недостаток дизайна IMHO, но пока существует четкое, согласованное соглашение об именах (такое как популярная ALL_CAPS), я не думаю, что это вызовет слишком много горя.'use strict'
.ALL CAPS
?Смотрите Object.freeze . Вы можете использовать,
const
если хотите сделатьconstants
ссылку также доступной только для чтения.источник
i
const
объявлению ES6 , например, свойства не могут быть повторно объявлены или переназначены, но если они имеют тип данныхobject
, они могут быть изменены.const constants
вместо,var constants
чтобы предотвратить переназначение переменной.IE поддерживает константы, например:
источник
const
). Можете ли вы объяснить, что с ним не так?ECMAScript 5 действительно вводит
Object.defineProperty
:Он поддерживается в любом современном браузере (а также IE ≥ 9).
Смотрите также: Object.defineProperty в ES5?
источник
writable: false
вызовет ошибку, если код, выполняющий присвоение, интерпретируется в строгом режиме ECMAScript 5. Просто еще одна причина, чтобы писать'use strict'
в ваш код.writable: false
так как это по умолчанию .Нет не вообще. Firefox реализует,
const
но я знаю, что IE нет.@Джон указывает на распространенную практику именования для conts, которая годами использовалась на других языках, и я не вижу причин, почему вы не могли бы это использовать. Конечно, это не значит, что кто-то не будет переписывать значение переменной в любом случае. :)
источник
В JavaScript я предпочитаю использовать функции для возврата постоянных значений.
источник
Документы Mozillas MDN Web содержат хорошие примеры и пояснения
const
. Выдержка:Но это печально, что IE9 / 10 по-прежнему не поддерживает
const
. И причина , это абсурд :Они не реализуют это, потому что другие браузеры не реализовали это правильно ?! Слишком боишься сделать это лучше? Стандартные определения или нет, константа является константой: устанавливается один раз, никогда не изменяется.
И ко всем идеям: каждая функция может быть перезаписана (XSS и т. Д.). Так что нет разницы в
var
илиfunction(){return}
.const
это единственная настоящая константа.Обновление: IE11 поддерживает
const
:источник
Если вы не возражаете против использования функций:
Этот подход дает вам функции вместо обычных переменных, но гарантирует *, что никто не сможет изменить значение после его установки.
Лично я нахожу это довольно приятным, особенно после того, как привык к этому шаблону из наблюдаемых нокаутов.
* Если кто-то не переопределил функцию
constant
до того, как вы ее вызвалиисточник
a = constant(10); a(10); // 10
за нимa = constant(25); a(); //25
нет ошибок и предупреждений, нет указаний на то, что ваша константа была нарушена.a
то оно изменится на новое значениес помощью «нового» API объекта вы можете сделать что-то вроде этого:
взгляните на это в Mozilla MDN для получения дополнительной информации. Это не переменная первого уровня, так как она прикреплена к объекту, но если у вас есть область действия, вы можете присоединить ее к этому.
this
должно работать так же. Так, например, выполнение этого в глобальной области действия объявит псевдо-константное значение в окне (что является действительно плохой идеей, вы не должны небрежно объявлять глобальные переменные)примечание: назначение вернет вам назначенное значение в консоли, но значение переменной не изменится
источник
Группируйте константы в структуры, где это возможно:
Пример, в моем текущем игровом проекте, я использовал ниже:
Назначение:
Comparision:
Совсем недавно я использую, для сравнения:
IE11 с новым стандартом ES6, который имеет декларацию «const».
Выше работает в более ранних браузерах, таких как IE8, IE9 и IE10.
источник
Вы можете легко снабдить свой сценарий механизмом для констант, которые могут быть установлены, но не изменены. Попытка изменить их приведет к ошибке.
источник
Забудьте IE и используйте
const
ключевое слово.источник
Тем не менее, нет точного кросс-браузерного предопределенного способа сделать это, вы можете достичь этого, контролируя область действия переменных, как показано в других ответах.
Но я предложу использовать пространство имен, чтобы отличать его от других переменных. это уменьшит вероятность столкновения до минимума от других переменных.
Правильное пространство имен, как
так что при использовании это будет
iw_constant.name
илиiw_constant.age
Вы также можете заблокировать добавление любого нового ключа или изменение любого ключа внутри iw_constant с помощью метода Object.freeze. Однако его не поддерживается в устаревшем браузере.
например:
Для старых браузеров вы можете использовать метод polyfill for freeze.
Если вы согласны с вызовом функции, лучше всего использовать кросс-браузерный способ определения константы. Определение области вашего объекта в пределах самореализующейся функции и возвращение функции get для ваших констант ex:
// чтобы получить значение используйте
iw_constant('name')
илиiw_constant('age')
** В обоих примерах вы должны быть очень осторожны с интервалом имен, чтобы ваш объект или функция не заменялись другой библиотекой. (Если будет заменен сам объект или функция, вся ваша константа будет работать)
источник
Некоторое время я указывал «константы» (которые на самом деле не были константами) в литералах объектов, передаваемых в
with()
операторы. Я думал, что это было так умно. Вот пример:В прошлом я также создавал
CONST
пространство имен, в которое я помещал бы все свои константы. Опять же с накладными расходами. Sheesh.Теперь, я просто
var MY_CONST = 'whatever';
в КИСС .источник
with
.Мое мнение (работает только с объектами).
Пытаться! Но поймите - это объект, а не простая переменная.
Попробуйте также просто:
источник
У меня тоже была проблема с этим. И после долгого времени поиска ответа и просмотра всех ответов всех, я думаю, я нашел жизнеспособное решение для этого.
Кажется, что большинство ответов, которые я встречал, использует функции для хранения констант. Как пишут многие пользователи форумов MANY, функции могут быть легко переписаны пользователями на стороне клиента. Меня заинтриговал ответ Кейта Эветса о том, что к объекту констант нельзя получить доступ извне, а только из внутренних функций.
Итак, я придумал это решение:
Поместите все в анонимную функцию, чтобы клиентская сторона не могла изменять переменные, объекты и т. Д. Также скрывайте «реальные» функции, заставляя другие функции вызывать «реальные» функции изнутри. Я также подумал об использовании функций для проверки, была ли функция изменена пользователем на стороне клиента. Если функции были изменены, измените их обратно, используя переменные, которые «защищены» внутри и не могут быть изменены.
Также кажется, что безопасность - это действительно проблема, и нет способа «спрятать» ваше программирование от клиентской стороны. Хорошая идея для меня - сжать ваш код так, чтобы любому, включая вас, программиста, было действительно трудно его прочитать и понять. Есть сайт, на который вы можете перейти: http://javascriptcompressor.com/ . (Это не мой сайт, не волнуйтесь, я не рекламирую.) Это сайт, который позволит вам сжимать и запутывать код Javascript бесплатно.
источник
Ясно, что это показывает необходимость стандартизированного кросс-браузерного ключевого слова const.
Но сейчас:
или
И то, и другое кажется достаточным, а все остальное похоже на стрельбу по мухе из базуки.
источник
Я использую
const
вместо этогоvar
в своих скриптах Greasemonkey, но это потому, что они будут работать только в Firefox ...Соглашение об именах действительно может быть подходом (я делаю и то и другое!).
источник
В JavaScript моя практика состояла в том, чтобы как можно больше избегать констант и использовать вместо них строки. Проблемы с константами появляются, когда вы хотите представить свои константы внешнему миру:
Например, можно реализовать следующий API даты:
Но гораздо короче и естественнее просто написать:
Таким образом, «дни» и «часы» действительно действуют как константы, потому что вы не можете изменить извне, сколько секунд представляют «часы». Но это легко переписать
MyModule.Date.HOUR
.Такой подход также поможет в отладке. Если Firebug скажет вам
action === 18
, довольно сложно понять, что это значит, но когда вы видите,action === "save"
это сразу понятно.источник
"Hours"
вместо"hours"
- но IDE может дать вам знать на ранней стадии, чтоDate.Hours
это не определено.Хорошо, это уродливо, но оно дает мне константу в Firefox и Chromium, непостоянную константу (WTF?) В Safari и Opera и переменную в IE.
Конечно, eval () - это зло, но без него IE выдает ошибку, мешающую запуску скриптов.
Safari и Opera поддерживают ключевое слово const, но вы можете изменить значение const .
В этом примере серверный код записывает JavaScript на страницу, заменяя {0} значением.
Для чего это хорошо? Не очень, так как это не кросс-браузер. В лучшем случае, возможно, немного спокойствия, что по крайней мере некоторые браузеры не позволят букмарклетам или сторонним скриптам изменять значение.
Протестировано с Firefox 2, 3, 3.6, 4, Iron 8, Chrome 10, 12, Opera 11, Safari 5, IE 6, 9.
источник
Если это стоит упомянуть, вы можете определить константы в угловых, используя
$provide.constant()
источник
Улучшенная версия ответа Бёрка, которая позволяет вам делать
CONFIG.MY_CONST
вместоCONFIG.get('MY_CONST')
.Требуется IE9 + или настоящий веб-браузер.
* Свойства доступны только для чтения, только если начальные значения неизменны.
источник
В JavaScript ES6 (повторно) введено
const
ключевое слово, которое поддерживается во всех основных браузерах .Кроме того,
const
ведет себя похоже наlet
.Он ведет себя, как и ожидалось, для примитивных типов данных (логическое, нулевое, неопределенное, число, строка, символ):
Внимание: знайте о подводных камнях относительно объектов:
Если вам действительно нужен неизменный и абсолютно постоянный объект: просто используйте,
const ALL_CAPS
чтобы прояснить свое намерение. Вconst
любом случае, это хорошее соглашение для всех деклараций, так что просто полагайтесь на него.источник
Другой альтернативой является что-то вроде:
Тогда просто:
var foo = constantMap.MY_CONSTANT
Если бы это было так,
constantMap.MY_CONSTANT = "bar"
это не имело бы никакого эффекта, так как мы пытаемся использовать оператор присваивания с геттером, поэтомуconstantMap.MY_CONSTANT === "myconstant"
останется верным.источник
в Javascript уже существуют константы . Вы определяете константу как это:
Это не может измениться путем переназначения.
источник
Ключевое слово «const» было предложено ранее, и теперь оно официально включено в ES6. Используя ключевое слово const, вы можете передать значение / строку, которая будет действовать как неизменяемая строка.
источник
Введение констант в JavaScript - в лучшем случае взлом.
Хорошим способом создания постоянных и глобально доступных значений в JavaScript было бы объявление литерала объекта с некоторыми свойствами «только для чтения», такими как это:
все ваши константы будут сгруппированы в один «вспомогательный» объект my, где вы сможете искать свои сохраненные значения или что-либо еще, что вы, возможно, решили поместить туда по этому вопросу. Теперь давайте проверим, работает ли он:
Как мы видим, свойство my.constant1 сохранило свое первоначальное значение. Вы сделали себе хорошие "зеленые" временные константы ...
Но, конечно, это только защитит вас от случайного изменения, изменения, обнуления или очистки значения константы вашего свойства с прямым доступом, как в данном примере.
В противном случае я все еще думаю, что константы для чайников. И я все еще думаю, что обмен вашей великой свободы на маленький уголок обманчивой безопасности - худшая возможная сделка.
источник
Rhino.js
реализуетconst
в дополнение к тому, что было упомянуто выше.источник