PHPでは、次のような驚くべき/恐ろしいことを行うことができます。
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
Javascriptでこのようなことをする方法はありますか?
たとえば、缶がvar name = 'the name of the variable';
ある場合、名前の付いた変数への参照を取得できますname
か?
PHPでは、次のような驚くべき/恐ろしいことを行うことができます。
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
Javascriptでこのようなことをする方法はありますか?
たとえば、缶がvar name = 'the name of the variable';
ある場合、名前の付いた変数への参照を取得できますname
か?
ECMA- / JavascriptはすべてObjects
と(これもオブジェクトの一種です)であるため、すべての変数は、 Variable-(または関数の場合はActivation ObjectContexts
)と呼ばれるものに格納されます。
したがって、次のような変数を作成する場合:
var a = 1,
b = 2,
c = 3;
グローバルスコープ(= NO関数コンテキスト)では、これらの変数をグローバルオブジェクト(=window
ブラウザー内)に暗黙的に書き込みます。
これらは、「ドット」または「ブラケット」表記を使用してアクセスできます。
var name = window.a;
また
var name = window['a'];
グローバルオブジェクトの変数オブジェクトはオブジェクト自体であるため、これはこの特定のインスタンスのグローバルオブジェクトに対してのみ機能します。関数のコンテキスト内では、アクティベーションオブジェクトに直接アクセスすることはできません。例えば:window
function foobar() {
this.a = 1;
this.b = 2;
var name = window['a']; // === undefined
alert(name);
name = this['a']; // === 1
alert(name);
}
new foobar();
new
自己定義オブジェクト(コンテキスト)の新しいインスタンスを作成します。new
関数のスコープがなければ、 global
(= window)にもなります。この例では、とにそれぞれ警告undefined
し1
ます。置き換える場合this.a = 1; this.b = 2
:
var a = 1,
b = 2;
両方のアラート出力は未定義になります。そのシナリオでは、変数a
とb
はからアクティベーションオブジェクトに格納されfoobar
ますが、アクセスすることはできません(もちろんa
、andを呼び出すことで直接アクセスできますb
)。
eval
1つのオプションです。
var a = 1;
var name = 'a';
document.write(eval(name)); // 1
警告:eval()
何をしているのかわからない場合は、複数のセキュリティ問題が発生するため、この関数の使用はお勧めしません。どうしても必要な場合を除いて、他のものを使用してください。詳細については、評価についてMDNページを参照してください。
ウィンドウオブジェクトを使用して取得できます。
window['myVar']
window
使用しているすべてのグローバル変数とグローバル関数への参照があります。
悪い答えがこれほど多くの票を獲得するのかわからない。非常に簡単な答えですが、複雑になります。
// If you want to get article_count
// var article_count = 1000;
var type = 'article';
this[type+'_count'] = 1000; // in a function we use "this";
alert(article_count);
これは例です:
for(var i=0; i<=3; i++) {
window['p'+i] = "hello " + i;
}
alert(p0); // hello 0
alert(p1); // hello 1
alert(p2); // hello 2
alert(p3); // hello 3
もう一つの例 :
var myVariable = 'coco';
window[myVariable] = 'riko';
alert(coco); // display : riko
したがって、 myVariableの値「coco」は可変cocoになります。
グローバルスコープ内のすべての変数はWindowオブジェクトのプロパティであるためです。
a = 'varname';
str = a+' = '+'123';
eval(str)
alert(varname);
これを試して...
Javascriptでは、すべてのプロパティがキーと値のペアであるという事実を利用できます。jAndyはすでにこれについて言及しましたが、彼の答えはそれがどのように悪用されるかを示しているとは思いません。
通常、変数名を保持する変数を作成しようとしているのではなく、変数名を生成して使用しようとしています。PHPは$$var
表記法でそれを行いますが、プロパティキーは配列キーと交換可能であるため、Javascriptは必要ありません。
var id = "abc";
var mine = {};
mine[id] = 123;
console.log(mine.abc);
通常、変数を作成する必要があります。そのため、間接参照があるため、逆の方法でも実行できます。
var mine = {};
mine.abc = 123;
console.log(mine["a"+"bc"]);
ウィンドウやグローバル(ノード)などのグローバルオブジェクトを使用したくない場合は、次のように試すことができます。
var obj = {};
obj['whatever'] = 'There\'s no need to store even more stuff in a global object.';
console.log(obj['whatever']);
2019年
eval
演算子は、呼び出したコンテキストで文字列式を実行し、そのコンテキストから変数を返すことができます。literal object
理論的には次のように書くことでそれを行うことができますが{[varName]}
、定義上ブロックされています。だから私はこの質問に出くわし、ここの誰もが本当の解決策をもたらさずにただ遊んでいます。しかし、@AxelHeiderは良いアプローチをしています。
解決策はeval
です。ほとんど忘れられているオペレーター。(ほとんどのものはだと思いますwith()
)
eval
演算子は、呼び出したコンテキストで式を動的に実行できます。その式の結果を返します。これを使用して、関数のコンテキストで変数の値を動的に返すことができます。
例:
function exmaple1(){
var a = 1, b = 2, default = 3;
var name = 'a';
return eval(name)
}
example1() // return 1
function example2(option){
var a = 1, b = 2, defaultValue = 3;
switch(option){
case 'a': name = 'a'; break;
case 'b': name = 'b'; break;
default: name = 'defaultValue';
}
return eval (name);
}
example2('a') // return 1
example2('b') // return 2
example2() // return 3
eval
式が実行されることを常に明示的に記述していることに注意してください。コード内の不必要な驚きを避けるため。eval
非常に強い
ですが、あなたはすでにそれを知っていると確信しています
ところで、合法であればliteral object
、変数の名前と値をキャプチャするために使用できますが、計算されたプロパティ名とプロパティ値の省略形を組み合わせることができません。残念ながら、無効です。
functopn example( varName ){
var var1 = 'foo', var2 ='bar'
var capture = {[varName]}
}
example('var1') //trow 'Uncaught SyntaxError: Unexpected token }`
その場で複数のFormDataを描画する必要があり、オブジェクトの方法はうまく機能しました
var forms = {}
次に、ループ内で、使用したフォームデータを作成する必要がある場所で
forms["formdata"+counter]=new FormData();
forms["formdata"+counter].append(var_name, var_value);
これは、動的に名前が付けられた変数をエクスポートする必要がある人のための代替手段です
export {
[someVariable]: 'some value',
[anotherVariable]: 'another value',
}
// then.... import from another file like this:
import * as vars from './some-file'
もう1つの方法は、キーに動的に名前が付けられたオブジェクトを作成することです。
const vars = { [someVariable]: 1, [otherVariable]: 2 };
// consume it like this
vars[someVariable];
オブジェクトの使用も素晴らしいです。
var a=123
var b=234
var temp = {"a":a,"b":b}
console.log(temp["a"],temp["b"]);
これには受け入れられた答えがありますが、私は観察を追加したいと思います:
ES6では使用let
は機能しません:
/*this is NOT working*/
let t = "skyBlue",
m = "gold",
b = "tomato";
let color = window["b"];
console.log(color);
しかしvar
作品を使う
/*this IS working*/
var t = "skyBlue",
m = "gold",
b = "tomato";
let color = window["b"];
console.log(color);
これが一部の人に役立つことを願っています。
彼らが意味することはノーです、あなたはできません。それを成し遂げる方法はありません。だからあなたはこのようなことをすることができました
function create(obj, const){
// where obj is an object and const is a variable name
function const () {}
const.prototype.myProperty = property_value;
// .. more prototype
return new const();
}
ECMAScript5で実装されているものと同じような作成関数を持っています。
eval()は私のテストでは機能しませんでした。ただし、DOMツリーに新しいJavaScriptコードを追加することは可能です。したがって、新しい変数を追加する関数は次のとおりです。
function createVariable(varName,varContent)
{
var scriptStr = "var "+varName+"= \""+varContent+"\""
var node_scriptCode = document.createTextNode( scriptStr )
var node_script = document.createElement("script");
node_script.type = "text/javascript"
node_script.appendChild(node_scriptCode);
var node_head = document.getElementsByTagName("head")[0]
node_head.appendChild(node_script);
}
createVariable("dynamicVar", "some content")
console.log(dynamicVar)
グローバルオブジェクトに追加するのではなく、名前空間を作成して変数を宣言することをお勧めします。値を取得および設定する関数を作成することもできます
以下のコードスニペットを参照してください。
//creating a namespace in which all the variables will be defined.
var myObjects={};
//function that will set the name property in the myObjects namespace
function setName(val){
myObjects.Name=val;
}
//function that will return the name property in the myObjects namespace
function getName(){
return myObjects.Name;
}
//now we can use it like:
setName("kevin");
var x = getName();
var y = x;
console.log(y) //"kevin"
var z = "y";
console.log(z); //"y"
console.log(eval(z)); //"kevin"
これと同様の方法で、複数の変数を宣言して使用できます。これによりコード行が増えますが、コードはより堅牢になり、エラーが発生しにくくなります。
これは、phpで行ったことを正確に実行します。
var a = 1;
var b = 2;
var ccc = 3;
var name = 'a';
console.log( window[name] ); // 1