391

PHPでは、次のような驚くべき/恐ろしいことを行うことができます。

$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1

Javascriptでこのようなことをする方法はありますか?

たとえば、缶がvar name = 'the name of the variable';ある場合、名前の付いた変数への参照を取得できますnameか?

4

17 に答える 17

390

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)にもなります。この例では、とにそれぞれ警告undefined1ます。置き換える場合this.a = 1; this.b = 2

var a = 1,
    b = 2;

両方のアラート出力は未定義になります。そのシナリオでは、変数abはからアクティベーションオブジェクトに格納されfoobarますが、アクセスすることはできません(もちろんa、andを呼び出すことで直接アクセスできますb)。

于 2011-02-25T12:23:47.723 に答える
161

eval1つのオプションです。

var a = 1;
var name = 'a';

document.write(eval(name)); // 1

警告:eval()何をしているのかわからない場合は、複数のセキュリティ問題が発生するため、この関数の使用はお勧めしません。どうしても必要な場合を除いて、他のものを使用してください。詳細については、評価についてMDNページを参照してください。

于 2011-02-25T12:22:34.460 に答える
98

ウィンドウオブジェクトを使用して取得できます。

window['myVar']

window使用しているすべてのグローバル変数とグローバル関数への参照があります。

于 2011-02-25T12:21:56.863 に答える
55

悪い答えがこれほど多くの票を獲得するのかわからない。非常に簡単な答えですが、複雑になります。

// 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);
于 2015-01-21T09:11:26.087 に答える
32

これは例です:

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オブジェクトのプロパティであるためです。

于 2015-01-24T20:55:29.053 に答える
28
a = 'varname';
str = a+' = '+'123';
eval(str)
alert(varname);

これを試して...

于 2011-02-25T12:23:58.840 に答える
19

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"]);
于 2014-11-27T02:42:47.817 に答える
7

ウィンドウやグローバル(ノード)などのグローバルオブジェクトを使用したくない場合は、次のように試すことができます。

var obj = {};
obj['whatever'] = 'There\'s no need to store even more stuff in a global object.';

console.log(obj['whatever']);
于 2015-01-30T00:06:51.860 に答える
7

2019年

TL; DR

  • 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 }`
于 2019-01-04T19:08:26.327 に答える
6

その場で複数のFormDataを描画する必要があり、オブジェクトの方法はうまく機能しました

var forms = {}

次に、ループ内で、使用したフォームデータを作成する必要がある場所で

forms["formdata"+counter]=new FormData();
forms["formdata"+counter].append(var_name, var_value);
于 2017-09-17T23:21:21.837 に答える
3

これは、動的に名前が付けられた変数をエクスポートする必要がある人のための代替手段です

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];
于 2019-05-23T18:09:41.187 に答える
1

オブジェクトの使用も素晴らしいです。

var a=123
var b=234
var temp = {"a":a,"b":b}
console.log(temp["a"],temp["b"]);
于 2019-03-20T07:58:02.297 に答える
1

これには受け入れられた答えがありますが、私は観察を追加したいと思います:

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

これが一部の人に役立つことを願っています。

于 2019-03-23T09:36:34.193 に答える
-1

彼らが意味することはノーです、あなたはできません。それを成し遂げる方法はありません。だからあなたはこのようなことをすることができました

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で実装されているものと同じような作成関数を持っています。

于 2012-11-24T05:29:27.540 に答える
-1

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)
于 2014-10-05T22:50:13.707 に答える
-1

グローバルオブジェクトに追加するのではなく、名前空間を作成して変数を宣言することをお勧めします。値を取得および設定する関数を作成することもできます

以下のコードスニペットを参照してください。

//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"

これと同様の方法で、複数の変数を宣言して使用できます。これによりコード行が増えますが、コードはより堅牢になり、エラーが発生しにくくなります。

于 2020-09-01T17:16:15.720 に答える
-1

これは、phpで行ったことを正確に実行します。

var a = 1;
var b = 2;
var ccc = 3;
var name = 'a';
console.log( window[name] ); // 1
于 2020-09-16T11:30:01.557 に答える