JavaScriptの「変数」変数?


101

PHPで「変数」変数を使用できることはわかっています。例えば

$x = "variable";
$$x = "hello, world!";
echo $variable; // displays "hello, world!"

JavaScriptで文字列として変数をその名前で参照することは可能ですか?それはどのように行われますか?


配列は変数ではありません。配列を関数の引数として使用すると、JSインタープリターは配列へのポインターを使用します。プログラミングでは特定の用語の使用は正確であり、あなたが求めることはほとんど意味がありません
Mister Jojo

回答:


147

これに対する単一の解決策はありません(まあ、はありevalますが、それを真剣に検討しません)。を介して一部のグローバル変数に動的にアクセスすることは可能windowですが、関数に対してローカルな変数では機能しません。のプロパティにならないグローバル変数はwindowletand const、およびclassesで定義された変数です。

ほとんどの場合、変数変数を使用するよりも優れた解決策があります。代わりに、データ構造を見て、問題に適したものを選択する必要があります。

次のような名前の固定セットがある場合

// 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]);


複数の値を定義する例:var x = 1; var x、y = 2; x = 1; var x = 1、y = 2; var x = xx = 1; var y = x + x;
アミンマレキ

42

あなたがこれをするのに必死であるなら、あなたは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


evalstrictモードではローカル変数を作成できません。ただし、間接呼び出しではグローバル変数を作成できます。
Oriol 2016年

4

文字列のみでJavaScriptの変数を参照するには、次を使用できます

window['your_variable_name']

変数や、変数内のオブジェクトも設定および参照できます。


4

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配列内で宣言すること)は、きちんと機能するだけでなく、責任も大きくなります。


2

もちろんできますが、できません。変数はグローバルでなければなりません。

var killingFunction = 'alert'
var killMeNow = 'please'
var please = 'You have been killed!'
this[killingFunction](this[killMeNow])

2
var vars = {};
var var_name = "str";
vars[var_name] = "working";
console.log(vars["str"]);

0

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マニュアルから取られています。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.