JavaScriptで定数を使用する方法はありますか?
そうでない場合、定数として使用される変数を指定する一般的な方法は何ですか?
ES2015以降、JavaScript には次の概念がありconst
ます。
const MY_CONSTANT = "some-value";
これは、IE 8、9、および 10 を除くほとんどすべてのブラウザーで機能します。厳密モードを有効にする必要がある場合もあります。
var
古いブラウザーをサポートする必要がある場合、またはレガシー コードを使用している場合に、特定の値を変更してはならないことを示すために、ALL_CAPS などの規則を使用できます。
var MY_CONSTANT = "some-value";
変数を変更から保護しようとしていますか? その場合は、モジュール パターンを使用できます。
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() メソッドを使用する必要があります。
変数の値を厳密に保護する必要がない場合は、提案どおりにすべて大文字の規則を使用してください。
このconst
キーワードはECMAScript 6 ドラフトに含まれていますが、これまでのところ、ブラウザーのサポートはごくわずかです: http://kangax.github.io/compat-table/es6/。構文は次のとおりです。
const CONSTANT_NAME = 0;
"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
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>
ECMAScript 5 では以下が導入されていObject.defineProperty
ます。
Object.defineProperty (window,'CONSTANT',{ value : 5, writable: false });
最新のすべてのブラウザー(および IE ≥ 9)でサポートされています。
いいえ、一般的ではありません。Firefox は実装const
していますが、IE が実装していないことはわかっています。
@Johnは、他の言語で長年使用されてきた const の一般的な命名規則を指摘しています。それを使用できない理由はわかりません。もちろん、とにかく誰かが変数の値を上書きしないという意味ではありません。:)
JavaScriptでは、関数を使用して定数値を返すのが私の好みです。
function MY_CONSTANT() {
return "some-value";
}
alert(MY_CONSTANT());
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
:
const
IE11 には、 letMap
、、、、および を含む新しい ECMAScript 6 標準の明確に定義され、一般的に使用される機能のサポートとSet
、WeakMap
改善__proto__
された相互運用性のサポートが含まれています。
「新しい」オブジェクト 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
注: 割り当てにより、割り当てられた値がコンソールに返されますが、変数の値は変更されません。
関数の使用を気にしない場合:
var constant = function(val) {
return function() {
return val;
}
}
このアプローチでは、通常の変数の代わりに関数が提供されますが、一度設定された値は*誰も変更できないことが保証されます。
a = constant(10);
a(); // 10
b = constant(20);
b(); // 20
個人的には、特にノックアウトオブザーバブルからのこのパターンに慣れた後では、これはかなり楽しいと思います。
*constant
あなたが呼び出す前に誰かが関数を再定義しない限り
IE を忘れて、const
キーワードを使用します。
可能な場合、定数を構造体にグループ化します。
例として、現在のゲーム プロジェクトでは、以下を使用しています。
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 などの以前のブラウザーで動作します。
設定はできるが変更できない定数のメカニズムをスクリプトに簡単に装備できます。それらを変更しようとすると、エラーが発生します。
/* 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
それでも、それを行う正確なクロスブラウザの定義済みの方法はありません。他の回答で示されているように、変数のスコープを制御することで実現できます。
しかし、名前空間を使用して他の変数と区別することをお勧めします。これにより、他の変数との衝突の可能性が最小限に抑えられます。
のような適切な名前空間
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')
** どちらの例でも、オブジェクトまたは関数が他のライブラリを介して置き換えられないように、名前の間隔に細心の注意を払う必要があります (オブジェクトまたは関数自体が置き換えられる場合、定数全体が移動します)。
with()
しばらくの間、ステートメントに渡されるオブジェクト リテラルで "定数" (実際には定数ではありませんでした) を指定しました。とても賢いと思いました。次に例を示します。
with ({
MY_CONST : 'some really important value'
}) {
alert(MY_CONST);
}
過去に、CONST
すべての定数を配置する名前空間も作成しました。繰り返しますが、オーバーヘッドがあります。おいおい。
今はKISSvar MY_CONST = 'whatever';
するだけです。
私の意見(オブジェクトでのみ機能します)。
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;
これは明らかに、標準化されたクロスブラウザーの const キーワードの必要性を示しています。
しかし、今のところ:
var myconst = value;
また
Object['myconst'] = value;
どちらも十分に思えますが、それ以外はバズーカでハエを撃つようなものです。
さて、これは醜いですが、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でテスト済み。
言及する価値がある場合は、次を使用して角度で定数を定義できます$provide.constant()
angularApp.constant('YOUR_CONSTANT', 'value');
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"
すぐに理解できます。
const
私は Greasemonkey スクリプトで代わりにを使用var
していますが、これは Firefox でのみ実行されるためです...
名前規則も確かに有効な方法です (私は両方を行っています!)。
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」プロパティは元の値を保持しています。素敵な「グリーン」の一時定数を作成しました...
ただし、もちろん、これは、指定された例のように、直接アクセスしてプロパティ定数値を誤って変更、変更、無効化、または空にすることを防ぐだけです。
そうでなければ、定数はダミー用だと思います。そして、あなたの偉大な自由を欺瞞的なセキュリティの小さなコーナーと交換することは、考えられる最悪の取引だと今でも思います.
const キーワードは javascript 言語で使用できますが、IE ブラウザーはサポートされていません。残りのすべてのブラウザーがサポートされています。
Rhino.js
const
上記に加えて実装します。
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
詳細については、チェックアウトしてください
免責事項: このツールの作成者は私です。