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

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

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

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

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

Ответы [ 33 ]

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

Я использую const вместо var в моих скриптах Greasemonkey, но это потому, что они будут работать только в Firefox ...
Соглашение об именах действительно может быть подходящим способом (я делаю и то и другое!).

4 голосов
/ 25 декабря 2014

Если стоит упомянуть, вы можете определить константы в angular , используя $provide.constant()

angularApp.constant('YOUR_CONSTANT', 'value');
4 голосов
/ 25 декабря 2014

Улучшенная версия ответа Бёрка , позволяющая вам сделать CONFIG.MY_CONST вместо CONFIG.get('MY_CONST').

Требуется IE9 + или настоящий веб-браузер.

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

    var result = {};
    for (var n in constants)
        if (constants.hasOwnProperty(n))
            Object.defineProperty(result, n, { value: constants[n] });

    return result;
}());

* Свойства доступны только для чтения, только если начальные значения неизменны.

4 голосов
/ 17 января 2011

В JavaScript я старался избегать как можно больше констант и вместо этого использовать строки. Проблемы с константами появляются, когда вы хотите представить свои константы внешнему миру:

Например, можно реализовать следующий API даты:

date.add(5, MyModule.Date.DAY).add(12, MyModule.Date.HOUR)

Но гораздо короче и естественнее просто написать:

date.add(5, "days").add(12, "hours")

Таким образом, «дни» и «часы» действительно действуют как константы, потому что вы не можете изменить снаружи, сколько секунд представляет «часы». Но легко перезаписать MyModule.Date.HOUR.

Такой подход также поможет при отладке. Если Firebug скажет вам action === 18, довольно сложно понять, что это значит, но когда вы увидите action === "save", тогда это сразу станет ясно.

4 голосов
/ 28 июня 2011

Хорошо, это уродливо, но оно дает мне постоянную в Firefox и Chromium, непостоянную постоянную (WTF?) В Safari и Opera и переменную в IE.

Конечно, eval () - это зло, но без него IE выдает ошибку, не позволяющую запускать скрипты.

Safari и Opera поддерживают ключевое слово const, но вы можете изменить значение const .

В этом примере серверный код записывает JavaScript-код на страницу, заменяя {0} значением.

try{
    // i can haz const?
    eval("const FOO='{0}';");
    // for reals?
    var original=FOO;
    try{
        FOO='?NO!';
    }catch(err1){
        // no err from Firefox/Chrome - fails silently
        alert('err1 '+err1);
    }
    alert('const '+FOO);
    if(FOO=='?NO!'){
        // changed in Sf/Op - set back to original value
        FOO=original;
    }
}catch(err2){
    // IE fail
    alert('err2 '+err2);
    // set var (no var keyword - Chrome/Firefox complain about redefining const)
    FOO='{0}';
    alert('var '+FOO);
}
alert('FOO '+FOO);

Для чего это хорошо? Не так много, так как это не кросс-браузер. В лучшем случае, может быть, немного спокойствия, что по крайней мере некоторые браузеры не позволят букмарклетам или сторонним скриптам изменять значение.

Протестировано с Firefox 2, 3, 3,6, 4, Iron 8, Chrome 10, 12, Opera 11, Safari 5, IE 6, 9.

3 голосов
/ 28 июля 2015

Ключевое слово «const» было предложено ранее, и теперь оно официально включено в ES6. Используя ключевое слово const, вы можете передать значение / строку, которая будет действовать как неизменяемая строка.

3 голосов
/ 04 мая 2015

в Javascript уже существует констант . Вы определяете константу как это:

const name1 = value;

Это не может измениться путем переназначения.

3 голосов
/ 28 августа 2014

Другая альтернатива что-то вроде:

var constants = {
      MY_CONSTANT : "myconstant",
      SOMETHING_ELSE : 123
    }
  , constantMap = new function ConstantMap() {};

for(var c in constants) {
  !function(cKey) {
    Object.defineProperty(constantMap, cKey, {
      enumerable : true,
      get : function(name) { return constants[cKey]; }
    })
  }(c);
}

Тогда просто: var foo = constantMap.MY_CONSTANT

Если бы вы указали constantMap.MY_CONSTANT = "bar", это бы не имело никакого эффекта, поскольку мы пытаемся использовать оператор присваивания с геттером, поэтому constantMap.MY_CONSTANT === "myconstant" останется истинным.

2 голосов
/ 23 сентября 2013

ключевое слово const доступно на языке javscript, но не поддерживает браузер IE. Остальные все браузеры поддерживаются.

2 голосов
/ 10 февраля 2012

Введение констант в JavaScript - в лучшем случае взлом.

Хорошим способом создания постоянных и глобально доступных значений в JavaScript было бы объявление литерала объекта с некоторыми свойствами «только для чтения», такими как:

            my={get constant1(){return "constant 1"},
                get constant2(){return "constant 2"},
                get constant3(){return "constant 3"},
                get constantN(){return "constant N"}
                }

все ваши константы будут сгруппированы в один «вспомогательный» объект my, где вы сможете искать свои сохраненные значения или что-либо еще, что вы, возможно, решили поместить туда по этому вопросу. Теперь давайте проверим, работает ли он:

           my.constant1; >> "constant 1" 
           my.constant1 = "new constant 1";
           my.constant1; >> "constant 1" 

Как мы видим, свойство my.constant1 сохранило свое первоначальное значение. Вы сделали себе хорошие "зеленые" временные константы ...

Но, конечно, это защитит вас от случайного изменения, изменения, обнуления или очистки значения константы вашего свойства с прямым доступом, как в данном примере.

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

...