JavaScriptの文字列としての変数名


154

JavaScriptで文字列として変数名を取得する方法はありますか?(ココアのようNSStringFromSelectorに)

私はこのようにしたいと思います:

var myFirstName = 'John';
alert(variablesName(myFirstName) + ":" + myFirstName);

--> myFirstName:John

更新

JavaScriptを使用してブラウザーと別のプログラムを接続しようとしています。コールバックメソッドのために、ブラウザーから別のプログラムにインスタンス名を送信したいと思います。

FooClass = function(){};
FooClass.someMethod = function(json) {
  // Do something
}

instanceA = new FooClass();
instanceB = new FooClass();
doSomethingInAnotherProcess(instanceB); // result will be substituted by using instanceB.someMethod();

...

別のプログラムから:

evaluateJavascriptInBrowser("(instanceName).someMethod("resultA");");

PHP:PHPで 変数名を文字列として取得する方法は?


2
@delnan確かに、+ 1。「を書くことができればvariablesName(myFirstName)、すでに変数名を知っている」以外に言い方はありません。しようとしていますが、できません...
だます


1
多分それのためにあなたは変数に保存し、後でそれをjsonに例えば{"instanceA":instanceA}に変換し、それをajaxまたはget / post呼び出しを使用してサーバーに送信することができ、phpで処理してインスタンスの名前を取得することができます...
Geomorillo 2014年

@deceze、確かに、あなたは名前を知っていますが、それはあなたがそれを手動で入力できる/したくないという意味ではありません。たぶん、デバッグのためにたくさんの変数をダンプしたいと思うかもしれませんし、変数console.log("myvar = " + myvar);ごとに手動で何度も何度も入力する気になりません。
Synetech、

回答:


54

通常、名前を何らかの値にマップし、両方を取得できるようにする場合は、ハッシュテーブルを使用します。

var obj = { myFirstName: 'John' };
obj.foo = 'Another name';
for(key in obj)
    console.log(key + ': ' + obj[key]);


125
しかし、質問には答えません。
htafoya

1
@htafoya:間接的に、はい-すべてのプロパティはペアobjとして出力されname: valueます。しかし、説明文はより明確になる可能性があります。
マット

1
@Matコードは理解できますが、一般的にOP質問は、生成された文字列から変数を選択できる動的割り当てとして、より複雑なものに使用されます。または、単に値を出力するための辞書を作成するのはやり過ぎです。
htafoya

2
@htafoya-はい、C#のnameof(varname)のような単純なものです。
マット

1
これが「質問に答えない」唯一の理由は、「JavaScriptで定数または変数の名前を取得できないからです。必要なものに最も近いもの...」のように始まっていないためです。この他の答え:stackoverflow.com/a/37393679
bigpopakap

86

セスの答えと同様ですが、Object.keys()代わりに使用します:

const varToString = varObj => Object.keys(varObj)[0]

const someVar = 42
const displayName = varToString({ someVar })
console.log(displayName)


5
@titusfxを使用すると、constをletまたはvarに交換できます。これはまったく同じように機能します。しかし、そもそもオブジェクト分解にトランスパイラーを使用している場合は、おそらくconstがすでにサポートされています。
SethWhite

これはES6の使用に依存しているようですか?
オルーニー

1
@ O'Rooneyはい、ES6固有です。
ドーナツ

63

次の解決策を使用して問題を解決できます。

const myFirstName = 'John'
Object.keys({myFirstName})[0]

// returns "myFirstName"

3
この回答は[@ SethWhite's](stackoverflow.com/a/39669231/5876282)に似ていますが、かなり単純化されています。ありがとう!@bluejayke私はこの答えは最初に受け入れられた答えの数年後に来ると思います。しかし、はい、現在はこれが最善です-おそらく以下に
B Charles H

1
変数を受け入れる関数を作成してその名前を出力することは可能ですか?関数内でコードをラップしようとしましたが、idは引数として使用された名前を返しました
Wakan Tanka

@WakanTanka適切な質問を作成した場合は、そこで回答します。
仲間の見知らぬ人

@WakanTankaいいえ、それはうまくいきません。あなたが発見したように、それはあなたが関数の引数に与えた名前を出力するだけです。そのような関数がどのように古いJavascript仕様にコンパイルされるかを確認すると役立つと思います。この例(では見ることができますjsfiddle.net/bigpopakap/wq891ghr/2呼び出す関数から変数名を使用することは不可能ですので、:{変数variable} {変数}構文はわずかのためであること)
bigpopakap

42

ES6では、次のように記述できます。

let myVar = 'something';
let nameObject = {myVar};
let getVarNameFromObject = (nameObject) => {
  for(let varName in nameObject) {
    return varName;
  }
}
let varName = getVarNameFromObject(nameObject);

本当に見栄えの良いものではありませんが、それで仕事が完了します。

これは、ES6のオブジェクト分解を活用します。

詳細はこちら:https : //hacks.mozilla.org/2015/05/es6-in-depth-destructuring/


1
正解です!! このオブジェクト破壊の特定の使用法は、私にとっては初めてです(2行目はlet nameObject = {myVar}とても便利です。どこにも文書化されていないようです。リンクがありましたか?
Laurence Lord

2
@LaurenceLordそれはプロパティの省略表現と呼ばれます。定義なしのオブジェクトプロパティ(something: 'asdf')を割り当てると、JSは変数の名前とその値{something} === {something:something}でプロパティを定義します。ariya.io/2013/02/...
SethWhite

19
var x = 2;
for(o in window){ 
   if(window[o] === x){
      alert(o);
   }
}

ただし、「karim79」のようにすべきだと思います


8
これはウィンドウスコープでのみ機能します(関数内で中断します)。
jpillora 2015

1
同意-しかし、それはOPの質問に答えるのに最も近い。Gj。
Dembinski、2016年

また、プリミティブをテストしている場合は、同じ値を持つすべての変数に警告するか、2つの変数に同じオブジェクトが割り当てられている場合に警告します。たとえば、最初の行がそうであるx = 2; y = 2;x = {a:1}; b = x;、それらのそれぞれに警告する場合
aljgom

これを関数スコープで機能させたい場合は、次のようにウィンドウの代わりに関数名を使用してみてください: var foo = function f(){ f.x = 2; for(o in f){ if(f[o]===f.x) alert(o); } }呼び出しf()は 'x'を警告します
aljgom

1
@aljgom-良い点。ここでは、それを試すためのフィドルです。
マット

16

これは基本的な表現で機能します

const nameof = exp => exp.toString().match(/[.](\w+)/)[1];

nameof(() => options.displaySize);

スニペット:

var nameof = function (exp) { return exp.toString().match(/[.](\w+)/)[1]; };
var myFirstName = 'Chuck';
var varname = nameof(function () { return window.myFirstName; });
console.log(varname);


2
これは実際にはかなりうまくいきます!唯一の問題は、次のようなものを渡すときです: "subOptions"を返すnameof(()=> options.subOptions.displaySize)代わりに、次の正規表現を使用しました:exp.toString()。match(/(?= [^ 。] * $)(\ w +)/ g)[0]
ジムブラウン

以下から未定義になります:var a = {b: "c"}; alert(name(a)); function name(exp){exp.toString()。match(/(?= [^。] * $)(\ w +)/ g)[0]; } //名前
David Spector

@JimBrown、ありがとう!あなたのコメントは回答としてマークする必要があります!
evorios

14

おそらくpopは、安全のために[0]によるインデックス付けよりも優れています(変数はnullの可能性があります)。

const myFirstName = 'John'
const variableName = Object.keys({myFirstName}).pop();
console.log(`Variable ${variableName} with value '${variable}'`);

// returns "Variable myFirstName with value 'John'"

3
myFirstNameが関数(このコードを含む)に引数vとして渡された場合、variableNameはmyFirstNameではなくvとして報告されます。
David Spector

9
var somefancyvariable = "fancy";
Object.keys({somefancyvariable})[0];

これは、関数の変数の名前を返すため、関数にすることはできません。

// THIS DOESN'T WORK
function getVarName(v) {
    return Object.keys({v})[0];
}
// Returns "v"

編集:これを関数にする方法を指摘してくれた@Madeoに感謝します

function debugVar(varObj) {
    var varName = Object.keys(varObj)[0];
    console.log("Var \"" + varName + "\" has a value of \"" + varObj[varName] + "\"");
}

変数を含む単一の要素配列で関数を呼び出す必要があります。debugVar({somefancyvariable});
編集:私がテストしたすべてのブラウザーとObject.keys同じように参照できますkeysが、コメントによると、どこでも機能しません。


エラー:「変数キーが見つかりません」
Alexander Volkov

キーは定義されていません
アバランシェ

1
それはこのようになるはずでconst getVarName = (v) => Object.keys(v)[0];あり、次にこのような 関数を呼び出しますgetVarName({whatEverVariable})
Madeo

6

ECMAScript 5.1以降では、Object.keysを使用して、オブジェクトからすべてのプロパティの名前を取得できます。

次に例を示します。

// Get John’s properties (firstName, lastName)
var john = {firstName: 'John', lastName: 'Doe'};
var properties = Object.keys(john);

// Show John’s properties
var message = 'John’s properties are: ' + properties.join(', ');
document.write(message);


4

関数にさまざまなグローバル変数の値を変更する関数を記述させる場合、常にmyfirstnameであるとは限りません。これを試してみてください。

jsfiddleで実行

var jack = 'jill';
function window_getVarName(what)
{
  for (var name in window)
  {
    if (window[name]==what)
    return(name);
  }
  return("");
}
document.write(window_getVarName(jack));

ウィンドウ「ジャック」に書き込みます。


2
これは信頼できません。同じ値を持つウィンドウオブジェクトには、任意の数の変数が存在する可能性があります。
テイラーブキャナン2015

2

JavaScriptで型を反映し、プロパティとメソッドの名前を取得できますが、必要なのLambda Expressions Treesは.NETのようなものです。動的な性質とJavaScriptでの静的型システムがないため、それは不可能だと思います。


3
JSがラムダや関数型プログラミングの関連ツールに不十分だとは思いません。

しかし、.NETには式ツリーに相当する構造はないと思います。
Jahan

2

私はこれが必要で、オブジェクトを使用したくないので、次の解決策を考え出し、質問を変えました。

変数名を文字列に変換する代わりに、文字列を変数に変換します。

もちろん、これは変数名がわかっている場合にのみ機能します。

これを取る:

var height = 120;
testAlert(height);

次のように表示されます。

height: 120

これは次のように行うことができます:

function testAlert(ta)
{
    a = window[ta];
    alert(ta + ': ' + a); 
}

var height = 120;
testAlert("height");
// displays: height: 120

したがって、文字列を使用し、コマンドを使用して"height"それを変数に変換します。heightwindow[]


2
2番目のケースでwindowは、同じ名前の変数がウィンドウスコープで宣言されているため、高さはオブジェクトのプロパティです。これは、変数がウィンドウスコープで宣言され、関数/クロージャでは宣言されていない場合にのみ機能します。
xoxox 16

2

これまでに見つけたショーツの方法は、変数名を文字列として取得する方法です。

const name = obj => Object.keys(obj)[0];

const whatsMyName = "Snoop Doggy Dogg";

console.log( "Variable name is: " + name({ whatsMyName }) );
//result: Variable name is: whatsMyName


1

これは、Internet Explorer(9、10、11)、Google Chrome 5を使用して機能しました。

   
var myFirstName = "Danilo";
var varName = Object.keys({myFirstName:0})[0];
console.log(varName);

ブラウザー互換性テーブル:https :
//developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys


Google Chrome 5?本当に??
avalanche1

2
@ avalanche1、MDNバージョンの互換性テーブルによると。
danilo

0

私は誰かが示唆したようにJSONに基づいてこの関数を作成しましたが、私のデバッグニーズにうまく機能します

function debugVar(varNames){
let strX = "";
function replacer(key, value){
    if (value === undefined){return "undef"}
    return value
    }    
for (let arg of arguments){
let lastChar;
    if (typeof arg!== "string"){
        let _arg = JSON.stringify(arg, replacer);
        _arg = _arg.replace('{',"");
        _arg = _arg.replace('}',"");            
        _arg = _arg.replace(/:/g,"=");
        _arg = _arg.replace(/"/g,"");
        strX+=_arg;
    }else{
    strX+=arg;
    lastChar = arg[arg.length-1];
    }
    if (arg!==arguments[arguments.length-1]&&lastChar!==":"){strX+=" "};
}
console.log(strX)    
}
let a = 42, b = 3, c;
debugVar("Begin:",{a,b,c},"end")


-3

いいえ、ありません。
さらに、を記述できる場合variablesName(myFirstName)、変数名( "myFirstName")はすでにわかっています。


11
必ずしもコードが縮小されている場合は、trueわけではありません。)
秘密の

9
また、nameof(myVariable)C#で(たとえば、文字列 "myVariable"を返す)を使用することのポイントは、コードのリファクタリングやその他の変更を行う際のミスを防ぐことです。一般的な使用例は、スローされるエラーメッセージに変数名を追加することです。 。ほとんどの部分は、私が文字列のコードのにおいをリテラル、および疑わしい理由は少なくともVisual Studioの、赤/オレンジ色で示して、それらをであると考え、私は私が知っている知っている、この質問には、JavaScriptについてですが、私はここで終了し、なぜ私は説明しました。
merrr

var test = 1235125142; console.log(Object.keys({test})。pop())// "test"
bluejayke

1
@bluejayke私を無知と呼んでいますが、8年経ってもconsole.log('test')、それが本当に必要であるか、またはそれが本当に必要な場合に、それがどのように優れているかはまだわかりません。
だます
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.