Есть ли константы в JavaScript? - PullRequest
       114

Есть ли константы в JavaScript?

1106 голосов
/ 25 сентября 2008

Есть ли способ использовать константы в JavaScript?

Если нет, какова общая практика определения переменных, которые используются в качестве констант?

Ответы [ 33 ]

999 голосов
/ 25 сентября 2008

Начиная с ES2015 , JavaScript имеет понятие const:

const MY_CONSTANT = "some-value";

Это будет работать в почти во всех браузерах, кроме IE 8, 9 и 10 . Некоторым также может потребоваться строгий режим .

Вы можете использовать var с соглашениями, такими как ALL_CAPS, чтобы показать, что определенные значения не следует изменять, если вам требуется поддержка старых браузеров или работа с устаревшим кодом:

var MY_CONSTANT = "some-value";
304 голосов
/ 25 сентября 2008

Вы пытаетесь защитить переменные от модификации? Если это так, то вы можете использовать шаблон модуля:

var CONFIG = (function() {
     var private = {
         'MY_CONST': '1',
         'ANOTHER_CONST': '2'
     };

     return {
        get: function(name) { return private[name]; }
    };
})();

alert('MY_CONST: ' + CONFIG.get('MY_CONST'));  // 1

CONFIG.MY_CONST = '2';
alert('MY_CONST: ' + CONFIG.get('MY_CONST'));  // 1

CONFIG.private.MY_CONST = '2';                 // error
alert('MY_CONST: ' + CONFIG.get('MY_CONST'));  // 1

При использовании этого подхода значения не могут быть изменены. Но вы должны использовать метод get () для CONFIG: (.

Если вам не нужно строго защищать значение переменных, просто сделайте, как предлагается, и используйте соглашение ALL CAPS.

119 голосов
/ 26 марта 2009

Ключевое слово const находится в черновой версии ECMAScript 6 , но пока что имеет лишь незначительную поддержку браузера: http://kangax.github.io/compat-table/es6/. Синтаксис:

const CONSTANT_NAME = 0;
67 голосов
/ 05 мая 2014
"use strict";

var constants = Object.freeze({
    "π": 3.141592653589793 ,
    "e": 2.718281828459045 ,
    "i": Math.sqrt(-1)
});

constants.π;        // -> 3.141592653589793
constants.π = 3;    // -> TypeError: Cannot assign to read only property 'π' …
constants.π;        // -> 3.141592653589793

delete constants.π; // -> TypeError: Unable to delete property.
constants.π;        // -> 3.141592653589793

См. Object.freeze . Вы можете использовать const, если хотите сделать ссылку constants только для чтения.

64 голосов
/ 26 октября 2009

IE поддерживает константы, например ::100100

<script language="VBScript">
 Const IE_CONST = True
</script>
<script type="text/javascript">
 if (typeof TEST_CONST == 'undefined') {
    const IE_CONST = false;
 }
 alert(IE_CONST);
</script>
58 голосов
/ 09 января 2011

ECMAScript 5 действительно вводит Object.defineProperty:

Object.defineProperty (window,'CONSTANT',{ value : 5, writable: false });

Поддерживается в каждом современном браузере (а также IE ≥ 9).

См. Также: Object.defineProperty в ES5?

24 голосов
/ 25 сентября 2008

Нет, не в общем. Firefox реализует const, но я знаю, что IE нет.


@ John указывает на обычную практику именования для conts, которая годами использовалась на других языках, я не вижу причин, почему вы не могли бы использовать это. Конечно, это не значит, что кто-то не будет переписывать значение переменной в любом случае. :)

20 голосов
/ 30 апреля 2011

Web-документы Mozillas MDN содержат хорошие примеры и пояснения по поводу const. Выдержки:

// define MY_FAV as a constant and give it the value 7
const MY_FAV = 7;

// this will throw an error - Uncaught TypeError: Assignment to constant variable.
MY_FAV = 20;

Но, к сожалению, IE9 / 10 по-прежнему не поддерживает const. И причина в том, что это абсурд :

Итак, что IE9 делает с const? Так далеко, наше решение было не поддержать это. Это еще не консенсус особенность, поскольку это никогда не было доступно во всех браузерах.

...

В конце концов, это кажется лучшим Долгосрочное решение для Интернета заключается в оставь это и ждать процессы стандартизации для запуска их Конечно.

Они не реализуют это, потому что другие браузеры не реализовали это правильно ?! Слишком боишься сделать это лучше? Стандартные определения или нет, константа является константой: устанавливается один раз, никогда не изменяется.

И ко всем идеям: каждая функция может быть перезаписана (XSS и т. Д.). Так что нет никакой разницы в var или function(){return}. const является единственной действительной константой.

Обновление: IE11 поддерживает const:

IE11 включает поддержку четко определенных и часто используемых функций нового стандарта ECMAScript 6, включая let, const, Map, Set и WeakMap, а также __proto__ для улучшения совместимости.

18 голосов
/ 24 ноября 2010

В JavaScript я предпочитаю использовать функции для возврата постоянных значений.

function MY_CONSTANT() {
   return "some-value";
}


alert(MY_CONSTANT());
17 голосов
/ 02 ноября 2012

с «новым» Object api вы можете сделать что-то вроде этого:

var obj = {};
Object.defineProperty(obj, 'CONSTANT', {
  configurable: false
  enumerable: true,
  writable: false,
  value: "your constant value"
});

посмотрите на это в Mozilla MDN для получения более подробной информации. Это не переменная первого уровня, так как она прикреплена к объекту, но если у вас есть область действия, вы можете присоединить ее к этому. this тоже должно работать. Так, например, выполнение этого в глобальной области действия объявит псевдо-константное значение в окне (что является очень плохой идеей, вы не должны объявлять глобальные переменные небрежно)

Object.defineProperty(this, 'constant', {
  enumerable: true, 
  writable: false, 
  value: 7, 
  configurable: false
});

> constant
=> 7
> constant = 5
=> 7

примечание: назначение вернет вам назначенное значение в консоли, но значение переменной не изменится

...