1169

JavaScriptで定数を使用する方法はありますか?

そうでない場合、定数として使用される変数を指定する一般的な方法は何ですか?

4

33 に答える 33

1034

ES2015以降、JavaScript には次の概念がありconstます。

const MY_CONSTANT = "some-value";

これは、IE 8、9、および 10 を除くほとんどすべてのブラウザーで機能します。厳密モードを有効にする必要がある場合もあります。

var古いブラウザーをサポートする必要がある場合、またはレガシー コードを使用している場合に、特定の値を変更してはならないことを示すために、ALL_CAPS などの規則を使用できます。

var MY_CONSTANT = "some-value";
于 2008-09-24T22:46:03.687 に答える
315

変数を変更から保護しようとしていますか? その場合は、モジュール パターンを使用できます。

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

このアプローチを使用すると、値を変更できません。ただし、CONFIG :( で get() メソッドを使用する必要があります。

変数の値を厳密に保護する必要がない場合は、提案どおりにすべて大文字の規則を使用してください。

于 2008-09-25T03:14:30.750 に答える
123

このconstキーワードはECMAScript 6 ドラフトに含まれていますが、これまでのところ、ブラウザーのサポートはごくわずかです: http://kangax.github.io/compat-table/es6/。構文は次のとおりです。

const CONSTANT_NAME = 0;
于 2009-03-26T20:29:50.643 に答える
71
"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

于 2014-05-04T23:58:25.097 に答える
64

IE は、次のような定数をサポートしています。

<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>
于 2009-10-26T19:22:46.680 に答える
59

ECMAScript 5 では以下が導入されていObject.definePropertyます。

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

最新のすべてのブラウザー(および IE ≥ 9)でサポートされています。

参照: ES5 の Object.defineProperty?

于 2011-01-09T00:41:34.273 に答える
24

いいえ、一般的ではありません。Firefox は実装constしていますが、IE が実装していないことはわかっています。


@Johnは、他の言語で長年使用されてきた const の一般的な命名規則を指摘しています。それを使用できない理由はわかりません。もちろん、とにかく誰かが変数の値を上書きしないという意味ではありません。:)

于 2008-09-24T22:45:51.440 に答える
20

JavaScriptでは、関数を使用して定数値を返すのが私の好みです。

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


alert(MY_CONSTANT());
于 2010-11-24T19:46:52.457 に答える
20

Mozilla の MDN Web Docsには、 に関する良い例と説明が含まれてい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 で何をしているのでしょうか? これまでのところ、サポートしないという決定が下されています。すべてのブラウザで利用できるわけではないため、まだコンセンサス機能ではありません。

...

結局のところ、Web にとって最良の長期的な解決策は、Web を除外し、標準化プロセスが自然に進むのを待つことです。

他のブラウザが正しく実装していないため、実装していませんか?! それを改善することを恐れすぎていますか?標準の定義であろうとなかろうと、定数は定数です。一度設定すると、変更されることはありません。

そして、すべてのアイデアに対して: すべての関数は上書きできます (XSS など)。varしたがって、またはに違いはありませんfunction(){return}constが唯一の実定数です。

更新: IE11は以下をサポートしています const:

constIE11 には、 let Map、、、、および を含む新しい ECMAScript 6 標準の明確に定義され、一般的に使用される機能のサポートとSetWeakMap改善__proto__された相互運用性のサポートが含まれています。

于 2011-04-30T09:57:54.770 に答える
17

「新しい」オブジェクト API を使用すると、次のようなことができます。

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

詳細については、Mozilla MDNでthisを参照してください。オブジェクトにアタッチされているため、最初のレベルの変数ではありませんが、スコープがあれば、何でもアタッチできます。this同様に動作するはずです。したがって、たとえば、グローバルスコープでこれを行うと、ウィンドウで疑似定数値が宣言されます(これは本当に悪い考えです。グローバル変数を不用意に宣言しないでください)

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

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

注: 割り当てにより、割り当てられた値がコンソールに返されますが、変数の値は変更されません。

于 2012-11-02T11:45:03.487 に答える
17

関数の使用を気にしない場合:

var constant = function(val) {
   return function() {
        return val;
    }
}

このアプローチでは、通常の変数の代わりに関数が提供されますが、一度設定された値は*誰も変更できないことが保証されます。

a = constant(10);

a(); // 10

b = constant(20);

b(); // 20

個人的には、特にノックアウトオブザーバブルからのこのパターンに慣れた後では、これはかなり楽しいと思います。

*constantあなたが呼び出す前に誰かが関数を再定義しない限り

于 2013-12-30T19:42:39.353 に答える
14

IE を忘れて、constキーワードを使用します。

于 2011-07-19T05:10:32.403 に答える
14

可能な場合、定数を構造体にグループ化します。

例として、現在のゲーム プロジェクトでは、以下を使用しています。

var CONST_WILD_TYPES = {
    REGULAR: 'REGULAR',
    EXPANDING: 'EXPANDING',
    STICKY: 'STICKY',
    SHIFTING: 'SHIFTING'
};

割り当て:

var wildType = CONST_WILD_TYPES.REGULAR;

比較:

if (wildType === CONST_WILD_TYPES.REGULAR) {
    // do something here
}

最近では、比較のために使用しています:

switch (wildType) {
    case CONST_WILD_TYPES.REGULAR:
        // do something here
        break;
    case CONST_WILD_TYPES.EXPANDING:
        // do something here
        break;
}

IE11 には、「const」宣言を持つ新しい ES6 標準があります。
上記は、IE8、IE9、IE10 などの以前のブラウザーで動作します。

于 2015-07-02T13:12:50.133 に答える
12

設定はできるが変更できない定数のメカニズムをスクリプトに簡単に装備できます。それらを変更しようとすると、エラーが発生します。

/* author Keith Evetts 2009 License: LGPL  
anonymous function sets up:  
global function SETCONST (String name, mixed value)  
global function CONST (String name)  
constants once set may not be altered - console error is generated  
they are retrieved as CONST(name)  
the object holding the constants is private and cannot be accessed from the outer script directly, only through the setter and getter provided  
*/

(function(){  
  var constants = {};  
  self.SETCONST = function(name,value) {  
      if (typeof name !== 'string') { throw new Error('constant name is not a string'); }  
      if (!value) { throw new Error(' no value supplied for constant ' + name); }  
      else if ((name in constants) ) { throw new Error('constant ' + name + ' is already defined'); }   
      else {   
          constants[name] = value;   
          return true;  
    }    
  };  
  self.CONST = function(name) {  
      if (typeof name !== 'string') { throw new Error('constant name is not a string'); }  
      if ( name in constants ) { return constants[name]; }    
      else { throw new Error('constant ' + name + ' has not been defined'); }  
  };  
}())  


// -------------  demo ----------------------------  
SETCONST( 'VAT', 0.175 );  
alert( CONST('VAT') );


//try to alter the value of VAT  
try{  
  SETCONST( 'VAT', 0.22 );  
} catch ( exc )  {  
   alert (exc.message);  
}  
//check old value of VAT remains  
alert( CONST('VAT') );  


// try to get at constants object directly  
constants['DODO'] = "dead bird";  // error  
于 2011-04-08T07:15:46.167 に答える
9

それでも、それを行う正確なクロスブラウザの定義済みの方法はありません。他の回答で示されているように、変数のスコープを制御することで実現できます。

しかし、名前空間を使用して他の変数と区別することをお勧めします。これにより、他の変数との衝突の可能性が最小限に抑えられます。

のような適切な名前空間

var iw_constant={
     name:'sudhanshu',
     age:'23'
     //all varibale come like this
}

そのため、使用中はiw_constant.nameまたはiw_constant.age

Object.freeze メソッドを使用して、新しいキーの追加や iw_constant 内のキーの変更をブロックすることもできます。ただし、レガシー ブラウザではサポートされていません。

元:

Object.freeze(iw_constant);

古いブラウザでは、凍結方法にポリフィルを使用できます。


関数の呼び出しに問題がない場合は、クロスブラウザーで定数を定義するのが最善の方法です。自己実行関数内でオブジェクトをスコープし、定数の get 関数を返します。例:

var iw_constant= (function(){
       var allConstant={
             name:'sudhanshu',
             age:'23'
             //all varibale come like this

       };

       return function(key){
          allConstant[key];
       }
    };

//値を取得するには、 iw_constant('name')またはiw_constant('age')


** どちらの例でも、オブジェクトまたは関数が他のライブラリを介して置き換えられないように、名前の間隔に細心の注意を払う必要があります (オブジェクトまたは関数自体が置き換えられる場合、定数全体が移動します)。

于 2013-02-06T07:06:41.113 に答える
7

with()しばらくの間、ステートメントに渡されるオブジェクト リテラルで "定数" (実際には定数ではありませんでした) を指定しました。とても賢いと思いました。次に例を示します。

with ({
    MY_CONST : 'some really important value'
}) {
    alert(MY_CONST);
}

過去に、CONSTすべての定数を配置する名前空間も作成しました。繰り返しますが、オーバーヘッドがあります。おいおい。

今はKISSvar MY_CONST = 'whatever';するだけです。

于 2008-09-24T23:29:59.557 に答える
6

私の意見(オブジェクトでのみ機能します)。

var constants = (function(){
  var a = 9;

  //GLOBAL CONSTANT (through "return")
  window.__defineGetter__("GCONST", function(){
    return a;
  });

  //LOCAL CONSTANT
  return {
    get CONST(){
      return a;
    }
  }
})();

constants.CONST = 8; //9
alert(constants.CONST); //9

試す!しかし理解してください - これはオブジェクトですが、単純な変数ではありません。

また、試してみてください:

const a = 9;
于 2012-10-29T09:01:14.797 に答える
5

これは明らかに、標準化されたクロスブラウザーの const キーワードの必要性を示しています。

しかし、今のところ:

var myconst = value;

また

Object['myconst'] = value;

どちらも十分に思えますが、それ以外はバズーカでハエを撃つようなものです。

于 2012-11-10T22:39:23.907 に答える
4

さて、これは醜いですが、FirefoxとChromiumでは定数、SafariとOperaでは定数(WTF?)、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でテスト済み。

于 2011-06-28T04:39:48.040 に答える
4

言及する価値がある場合は、次を使用して角度で定数を定義できます$provide.constant()

angularApp.constant('YOUR_CONSTANT', 'value');
于 2014-12-25T11:16:26.740 に答える
4

JavaScript では、定数をできる限り避け、代わりに文字列を使用するようにしています。定数を外部に公開したい場合、定数の問題が発生します。

たとえば、次の Date 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"すぐに理解できます。

于 2011-01-17T14:07:36.600 に答える
4

const私は Greasemonkey スクリプトで代わりにを使用varしていますが、これは Firefox でのみ実行されるためです...
名前規則も確かに有効な方法です (私は両方を行っています!)。

于 2008-09-24T22:49:33.350 に答える
3

Javascript には既に定数が存在します。次のように定数を定義します。

const name1 = value;

これは、再割り当てによって変更することはできません。

于 2015-05-04T15:50:43.043 に答える
2

JavaScript に定数を導入することは、せいぜいハックです。

JavaScript で永続的でグローバルにアクセス可能な値を作成する良い方法は、次のような「読み取り専用」プロパティを使用してオブジェクト リテラルを宣言することです。

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

すべての定数を 1 つの "my" アクセサリ オブジェクトにグループ化して、格納されている値や、そのためにそこに置くことに決めたものを探すことができます。それでは、動作するかどうかをテストしましょう。

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

ご覧のとおり、「my.constant1」プロパティは元の値を保持しています。素敵な「グリーン」の一時定数を作成しました...

ただし、もちろん、これは、指定された例のように、直接アクセスしてプロパティ定数値を誤って変更、変更、無効化、または空にすることを防ぐだけです。

そうでなければ、定数はダミー用だと思います。そして、あなたの偉大な自由を欺瞞的なセキュリティの小さなコーナーと交換することは、考えられる最悪の取引だと今でも思います.

于 2012-02-10T06:12:25.960 に答える
2

const キーワードは javascript 言語で使用できますが、IE ブラウザーはサポートされていません。残りのすべてのブラウザーがサポートされています。

于 2013-09-23T08:40:16.740 に答える
2

Rhino.jsconst上記に加えて実装します。

于 2012-11-05T15:51:26.487 に答える
0

https://www.npmjs.com/package/constjsを確認してください。列挙型、文字列 const、およびビットマップを作成する 3 つの関数が用意されています。返された結果は凍結または封印されているため、作成後にプロパティを変更/削除することはできず、返された結果に新しいプロパティを追加することもできません

列挙型を作成:

var ConstJs = require('constjs');

var Colors = ConstJs.enum("blue red");

var myColor = Colors.blue;

console.log(myColor.isBlue()); // output true 
console.log(myColor.is('blue')); // output true 
console.log(myColor.is('BLUE')); // output true 
console.log(myColor.is(0)); // output true 
console.log(myColor.is(Colors.blue)); // output true 

console.log(myColor.isRed()); // output false 
console.log(myColor.is('red')); // output false 

console.log(myColor._id); // output blue 
console.log(myColor.name()); // output blue 
console.log(myColor.toString()); // output blue 

// See how CamelCase is used to generate the isXxx() functions 
var AppMode = ConstJs.enum('SIGN_UP, LOG_IN, FORGOT_PASSWORD');
var curMode = AppMode.LOG_IN;

console.log(curMode.isLogIn()); // output true 
console.log(curMode.isSignUp()); // output false 
console.log(curMode.isForgotPassword()); // output false 

文字列定数を作成します。

var ConstJs = require('constjs');

var Weekdays = ConstJs.const("Mon, Tue, Wed");
console.log(Weekdays); // output {Mon: 'Mon', Tue: 'Tue', Wed: 'Wed'} 

var today = Weekdays.Wed;
console.log(today); // output: 'Wed'; 

ビットマップを作成:

var ConstJs = require('constjs');

var ColorFlags = ConstJs.bitmap("blue red");
console.log(ColorFlags.blue); // output false 

var StyleFlags = ConstJs.bitmap(true, "rustic model minimalist");
console.log(StyleFlags.rustic); // output true 

var CityFlags = ConstJs.bitmap({Chengdu: true, Sydney: false});
console.log(CityFlags.Chengdu); //output true 
console.log(CityFlags.Sydney); // output false 

var DayFlags = ConstJs.bitmap(true, {Mon: false, Tue: true});
console.log(DayFlags.Mon); // output false. Default val wont override specified val if the type is boolean  

詳細については、チェックアウトしてください

免責事項: このツールの作成者は私です。

于 2015-05-01T20:19:15.160 に答える