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
及びContexts
(somekindオブジェクトのもである、)、すべての変数が呼び出さように格納されVariable-(または機能の場合には、アクティベーションオブジェクト)。
したがって、次のような変数を作成するとします。
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
とb
)。
eval
1つのオプションです。
var a = 1;
var name = 'a';
document.write(eval(name)); // 1
悪い回答が何票を獲得するのかわからない。答えは簡単ですが、複雑にします。
// 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);
this
」- この方法でグローバル変数にアクセスする場合は、明示的window
でなく、オブジェクトを使用することをお勧めしますthis
。this
あいまいです。
this
、やその他の変数を使用して変数にアクセスすることはできません。type
あなたが別の変数にその名前を持っている場合、あなたの例からは:function test(vname) { var type = 'article'; this[vname] = 'something else'; alert(type); }; test('type')
表示されますarticle
、ではありませんsomething else
。そして、それは「複雑な答え」が説明するものです。
これは例です:
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オブジェクトのプロパティだからです。
JavaScriptでは、すべてのプロパティがキーと値のペアであるという事実を使用できます。jAndyはすでにこれについて言及しましたが、彼の答えがそれがどのように悪用されるかを示しているとは思いません。
通常は、変数名を保持する変数を作成するのではなく、変数名を生成して使用します。PHPはそれを行います$$var
表記ますが、プロパティキーは配列キーと交換可能であるため、Javascriptは必要ありません。
var id = "abc";
var mine = {};
mine[id] = 123;
console.log(mine.abc);
123を返します。通常、変数を構築する必要があるため、間接指定が存在するため、逆の方法でも実行できます。
var mine = {};
mine.abc = 123;
console.log(mine["a"+"bc"]);
2019年
eval
演算子は、呼び出したコンテキストで文字列式を実行し、そのコンテキストから変数を返すことができます。 literal object
理論的には、書き込みによってそれを行うことができます{[varName]}
。だから私はこの質問に出くわし、ここにいる全員が実際の解決策をもたらすことなく遊んでいます。しかし、@ Axel Heiderは良いアプローチをしています。
解決策は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'
別の方法は、キーが動的に命名されるオブジェクトを単に作成することです
const vars = { [someVariable]: 1, [otherVariable]: 2 };
// consume it like this
vars[someVariable];
彼らが意味することはノーです、あなたはできません。それを成し遂げる方法はありません。だからあなたはこのようなことをすることができました
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();
}
ECMAScript 5に実装されているものと同じような作成関数を持っている
eval
オペレータ
テストでは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)
var node_head = document.getElementsByTagName("head")[0]
です。IDの代わりに使用することをおid="head"
<head>
これには受け入れられた答えがありますが、私は所見を追加したいと思います:
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);
これが一部に役立つことを願っています。
const vars = { t, m, b }; console.log(vars['b'])
。それ以外の場合もeval
動作します。