PHPで「変数」変数を使用できることはわかっています。例えば
$x = "variable";
$$x = "hello, world!";
echo $variable; // displays "hello, world!"
JavaScriptで文字列として変数をその名前で参照することは可能ですか?それはどのように行われますか?
PHPで「変数」変数を使用できることはわかっています。例えば
$x = "variable";
$$x = "hello, world!";
echo $variable; // displays "hello, world!"
JavaScriptで文字列として変数をその名前で参照することは可能ですか?それはどのように行われますか?
回答:
これに対する単一の解決策はありません(まあ、はありeval
ますが、それを真剣に検討しません)。を介して一部のグローバル変数に動的にアクセスすることは可能window
ですが、関数に対してローカルな変数では機能しません。のプロパティにならないグローバル変数はwindow
、let
and const
、およびclass
esで定義された変数です。
ほとんどの場合、変数変数を使用するよりも優れた解決策があります。代わりに、データ構造を見て、問題に適したものを選択する必要があります。
次のような名前の固定セットがある場合
// BAD
var foo = 42;
var bar = 21;
var key = 'foo';
console.log(eval(key));
それらの名前/値をオブジェクトのプロパティとして保存し、ブラケット表記を使用して動的に検索します。
// GOOD
var obj = {
foo: 42,
bar: 21,
};
var key = 'foo';
console.log(obj[key]);
ではES2015 +それは使用して既存の変数のためにこれを行うにはさらに簡単です簡潔なプロパティ表記を:
// GOOD
var foo = 42;
var bar = 21;
var obj = {foo, bar};
var key = 'foo';
console.log(obj[key]);
次のような「連続して」番号付けされた変数がある場合
// BAD
var foo1 = 'foo';
var foo2 = 'bar';
var foo3 = 'baz';
var index = 1;
console.log(eval('foo' + index));
次に、代わりに配列を使用し、インデックスを使用して対応する値にアクセスする必要があります。
// GOOD
var foos = ['foo', 'bar', 'baz'];
var index = 1;
console.log(foos[index - 1]);
あなたがこれをするのに必死であるなら、あなたはeval()を使うことを試みることができます:
var data = "testVariable";
eval("var temp_" + data + "=123;");
alert(temp_testVariable);
または、ウィンドウオブジェクトを使用します。
var data = "testVariable";
window["temp_" + data] = 123;
alert(window["temp_" + data]);
http://www.hiteshagrawal.com/javascript/dynamic-variables-in-javascript
eval
strictモードではローカル変数を作成できません。ただし、間接呼び出しではグローバル変数を作成できます。
文字列のみでJavaScriptの変数を参照するには、次を使用できます
window['your_variable_name']
変数や、変数内のオブジェクトも設定および参照できます。
PHPとは異なり、JavaScriptはグローバル配列(現在宣言されているすべての変数名への参照を含む)へのアクセスを提供しません。そのため、JavaScriptは変数変数のネイティブサポートを提供していません。ただし、すべての変数を配列またはオブジェクトの一部として定義している限り、この機能をエミュレートできます。これにより、gloabls配列が作成されます。たとえば、次のhello
ようにグローバルスコープで変数を宣言する代わりに:
var hello = 'hello world';
オブジェクトの中にカプセル化しましょう。そのオブジェクトをvv(変数変数)と呼びます。
var vv = {
'hello': 'hello world',
//Other variable variables come here.
},
referToHello = 'hello';
これで、インデックスで変数を参照できるようになりました。変数を使用して配列のインデックスを提供できるので、実際には変数変数を使用しています。
console.log(vv[referToHello]); //Output: hello world
あなたの質問への答え
これを元の質問で指定したコードに適用してみましょう。
var vv = {
'x': 'variable',
'variable': 'hello world!'
};
console.log(vv[vv['x']]); //Displays "hello, world!"
実用化
前のコードは途方もなく面倒で実用的ではないように見えるかもしれませんが、このタイプのカプセル化を使用するJavaScriptの変数変数の実用的な用途があります。以下の例では、同じ概念を使用して、未定義の数のHTML要素のIDを取得しています。
var elementIds = [],
elements = ['message','fillOrStroke','sizePicker','colorPicker']; //The items in this array could be defined automatically via an input, database query, event, etc.
elements.forEach( (element) => {
elementIds[element] = document.getElementById(element);
});
この例elementIds
では、各要素のIDに基づいて変数変数(のキー)を宣言し、各要素のノードを各変数の値として割り当てます。また、JavaScriptでグローバル変数を使用することは一般的にお勧めできません。変数変数に一意のスコープを指定すること(この場合、elementIds
配列内で宣言すること)は、きちんと機能するだけでなく、責任も大きくなります。
もちろんできますが、できません。変数はグローバルでなければなりません。
var killingFunction = 'alert'
var killMeNow = 'please'
var please = 'You have been killed!'
this[killingFunction](this[killMeNow])
JavaScript eval(str)
関数を使用できます。
この関数は、提供された文字列をJSコードに変換して実行します。
例えば:
eval("console.log('hello world')"); // Logs hello world
変数変数として使用するには、次のようにします。
var a = "hello";
var hello = "world";
console.log(a + " " + eval(a)); // Logs hello world
これにより、次とまったく同じ出力が生成されます。
console.log(a + " " + hello); // Logs hello world
(例は、変数変数に関するPHPマニュアルから取られています。)