Variablenname als Zeichenfolge in Javascript

154

Gibt es eine Möglichkeit, einen Variablennamen als Zeichenfolge in Javascript abzurufen? (mögenNSStringFromSelector in Kakao )

Ich würde gerne so machen:

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

--> myFirstName:John

AKTUALISIEREN

Ich versuche, einen Browser und ein anderes Programm mit JavaScript zu verbinden. Ich möchte Instanznamen von einem Browser an ein anderes Programm zur Rückrufmethode senden:

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

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

...

Aus einem anderen Programm:

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

In PHP: Wie erhalte ich einen Variablennamen als String in PHP?

Fischkartoffel
quelle
2
@delnan In der Tat +1. Ich kann mir keinen anderen Weg vorstellen, als "Wenn Sie schreiben können variablesName(myFirstName), kennen Sie den Variablennamen bereits." Ich versuche es, aber ich kann nicht ...
täuschen
1
Vielleicht könnten Sie dafür in einer Variablen speichern und sie später in json konvertieren, zum Beispiel {"instanceA": instanceA}, und sie mit ajax oder get / post call an den Server senden und sie in PHP verarbeiten und den Namen der Instanz abrufen ...
Geomorillo
@deceze, sicher, Sie kennen den Namen, aber das bedeutet nicht, dass Sie ihn manuell eingeben können / möchten. Vielleicht möchten Sie eine Reihe von Variablen für Debugging-Zwecke sichern und möchten nicht console.log("myvar = " + myvar);für jede Variable immer wieder manuell eingeben .
Synetech

Antworten:

54

In der Regel verwenden Sie eine Hash-Tabelle für Situationen, in denen Sie einen Namen einem bestimmten Wert zuordnen und beide abrufen möchten.

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

karim79
quelle
123
Beantwortet die Frage jedoch nicht.
Htafoya
1
@htafoya: Indirekt ja - alle Eigenschaften von objwerden name: valuepaarweise gedruckt . Der erklärende Text könnte jedoch klarer sein.
Matt
1
@Mat Ich verstehe den Code, aber im Allgemeinen wird die OP-Frage für etwas Komplexeres wie dynamische Zuweisungen verwendet, bei denen Sie die Variable aus einer generierten Zeichenfolge auswählen können. Oder wo das einfache Erstellen eines Wörterbuchs zum Drucken eines Werts übertrieben ist.
Htafoya
2
@htafoya - ja, etwas Einfaches wie nameof (varname) in C #.
Matt
1
Ich denke, der einzige Grund, warum dies "die Frage nicht beantwortet", ist, dass es nicht mit "Sie können den Namen der Konstante oder einer Variablen in JavaScript nicht abrufen. Das, was dem am nächsten kommt, was Sie wollen ..." diese andere Antwort: stackoverflow.com/a/37393679
bigpopakap
86

Wie Seths Antwort, verwendet aber Object.keys()stattdessen:

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

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

Donuts
quelle
5
@titusfx Sie können const gegen let oder var austauschen und es funktioniert genauso. Wenn Sie jedoch in erster Linie einen Transpiler für die Objektzerstörung verwenden, unterstützt er wahrscheinlich bereits const.
SethWhite
Dies scheint von der Verwendung von ES6 abzuhängen?
O'Rooney
1
@ O'Rooney Ja, es ist ES6-spezifisch.
Donuts
63

Sie können die folgende Lösung verwenden, um Ihr Problem zu lösen:

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

// returns "myFirstName"
Fremder
quelle
3
Diese Antwort ähnelt [@ SethWhite's] ( stackoverflow.com/a/39669231/5876282 ), ist jedoch stark vereinfacht. Vielen Dank! @bluejayke Ich denke, diese Antwort kommt Jahre später nach der ursprünglich akzeptierten Antwort. Aber ja, derzeit ist dies die beste - außer vielleicht der unten
B Charles H
1
Ist es möglich, eine Funktion zu erstellen, die Variablen akzeptiert und deren Namen druckt? Ich habe versucht, Ihren Code in eine Funktion zu verpacken, aber id hat mir den Namen zurückgegeben, der als Argument verwendet wurde
Wakan Tanka
@WakanTanka Wenn Sie eine richtige Frage erstellen, werde ich sie dort beantworten.
Fellow Stranger
@ WakanTanka nein, das würde nicht funktionieren. Wie Sie festgestellt haben, wird nur der Name gedruckt, den Sie dem Funktionsargument geben. Ich denke, es hilft zu sehen, wie eine solche Funktion zu einer älteren Javascript-Spezifikation kompiliert werden würde. In diesem Beispiel ( jsfiddle.net/bigpopakap/wq891ghr/2 ) können Sie sehen, dass die Syntax {variable} nur für {variable: variable} steht, sodass es unmöglich ist, den Variablennamen aus der aufrufenden Funktion
bigpopakap
42

In ES6 können Sie Folgendes schreiben:

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

Nicht wirklich das am besten aussehende Ding, aber es erledigt den Job.

Dies nutzt die Objektzerstörung von ES6.

Weitere Informationen hier: https://hacks.mozilla.org/2015/05/es6-in-depth-destructuring/

SethWhite
quelle
1
Gute Antwort!! Diese besondere Verwendung der Objektzerstörung ist für mich neu (Zeile 2 ist let nameObject = {myVar}so nützlich! Sie scheint nirgendwo dokumentiert zu sein. Haben Sie irgendwelche Links?
Laurence Lord
2
@LaurenceLord heißt Property Shorthand. Wenn Sie eine Objekteigenschaft ohne Definition zuweisen (etwas: 'asdf'), definiert JS die Eigenschaft mit dem Namen der Variablen und ihrem Wert {Something} === {Something: Something}. ariya.io/2013/02/…
SethWhite
19
var x = 2;
for(o in window){ 
   if(window[o] === x){
      alert(o);
   }
}

Ich denke jedoch, Sie sollten "karim79" mögen

Kleeblatt
quelle
8
Dies funktioniert nur im Fensterbereich (Unterbrechungen innerhalb einer Funktion).
Jpillora
1
Einverstanden - aber es ist der Beantwortung der Frage des OP am nächsten. Gj.
Der Dembinski
Auch wenn Sie ein Grundelement testen, werden alle Variablen mit demselben Wert benachrichtigt, oder wenn zwei Variablen dasselbe Objekt zugewiesen ist. Zum Beispiel, wenn die erste Zeile war x = 2; y = 2;oder x = {a:1}; b = x;es jeden von ihnen alarmieren würde
aljgom
Wenn Sie möchten, dass dies in einem Funktionsbereich funktioniert , können Sie versuchen, den Funktionsnamen anstelle des Fensters zu verwenden, z. var foo = function f(){ f.x = 2; for(o in f){ if(f[o]===f.x) alert(o); } }f()
B
1
@aljgom - guter Punkt. Hier ist eine Geige , um es auszuprobieren.
Matt
16

Dies funktioniert für grundlegende Ausdrücke

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

Beispiel

nameof(() => options.displaySize);

Snippet:

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

BrunoLM
quelle
2
Das funktioniert eigentlich ganz gut! Das einzige Problem ist, wenn Sie Folgendes übergeben: nameof (() => options.subOptions.displaySize), das "subOptions" zurückgibt. Stattdessen habe ich diesen regulären Ausdruck verwendet: exp.toString (). match (/ (? = [^ .] * $) (\ w +) / g) [0]
Jim Brown
Ich werde undefiniert von: var a = {b: "c"}; Alarm (Name (a)); Funktionsname (exp) {exp.toString (). match (/ (? = [^.] * $) (\ w +) / g) [0]; } // Name
David Spector
@ JimBrown, danke! Ihr Kommentar muss als Antwort markiert werden!
Evorios
14

Wahrscheinlich wäre Pop aus Sicherheitsgründen besser als die Indizierung mit [0] (Variable könnte null sein).

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

// returns "Variable myFirstName with value 'John'"
Juangui Jordán
quelle
3
Wenn myFirstName als Argument v an eine Funktion (die diesen Code enthält) übergeben wird, wird variableName als v anstelle von myFirstName gemeldet.
David Spector
9
var somefancyvariable = "fancy";
Object.keys({somefancyvariable})[0];

Dies kann nicht zu einer Funktion gemacht werden, da der Name der Funktionsvariablen zurückgegeben wird.

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

Bearbeiten: Vielen Dank an @Madeo für den Hinweis, wie man daraus eine Funktion macht .

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

Sie müssen die Funktion mit einem einzelnen Elementarray aufrufen, das die Variable enthält. debugVar({somefancyvariable});
Bearbeiten: Object.keyskann als einfach bezeichnet werdenkeys in jedem Browser, in dem ich es getestet habe aber laut den Kommentaren funktioniert es nicht überall.

Cadiboo
quelle
Fehler: "Variable Schlüssel können nicht gefunden werden"
Alexander Volkov
Schlüssel ist nicht definiert
avalanche1
1
es sollte so sein const getVarName = (v) => Object.keys(v)[0];und dann die Funktion so aufrufengetVarName({whatEverVariable})
Madeo
6

Seit ECMAScript 5.1 können Sie verwenden Object.keys verwenden , um die Namen aller Eigenschaften eines Objekts .

Hier ist ein Beispiel:

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

Benny Neugebauer
quelle
4

Wenn eine Funktion eine Funktion schreibt, die verschiedene globale Variablenwerte ändert, ist dies nicht immer mein Vorname, sondern das, was gerade passiert. Versuchen Sie, dass dies für mich funktioniert hat.

Laufen Sie in 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));

Schreibt in das Fenster 'Jack'.

Matt Smith
quelle
2
Dies ist nicht zuverlässig. Das Fensterobjekt kann eine beliebige Anzahl von Variablen mit demselben Wert enthalten.
Taylor Buchanan
2

Sie können über Typen in Javascript nachdenken und den Namen der Eigenschaften und Methoden abrufen. Was Sie jedoch benötigen, ist etwas wie Lambda Expressions Treesin .NET. Ich denke, dies ist aufgrund der Dynamik und des Fehlens eines statischen Typsystems in Javascript nicht möglich.

Jahan
quelle
3
Ich glaube nicht, dass JS Lambdas oder verwandte Werkzeuge der funktionalen Programmierung verfehlt.
Ich denke jedoch, dass es in .NET keine Struktur gibt, die Ausdrucksbäumen entspricht.
Jahan
2

Ich brauchte das, wollte keine Objekte verwenden und fand die folgende Lösung, um die Frage umzudrehen.

Anstatt den Variablennamen in eine Zeichenfolge umzuwandeln, konvertiere ich eine Zeichenfolge in eine Variable.

Dies funktioniert natürlich nur, wenn der Variablenname bekannt ist.

Nimm das:

var height = 120;
testAlert(height);

Dies sollte Folgendes anzeigen:

height: 120

Dies kann folgendermaßen geschehen:

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

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

Also benutze ich den String "height"und verwandle ihn heightmit dem window[]Befehl in eine Variable .

SPRBRN
quelle
2
In Ihrem zweiten Fall ist height eine Eigenschaft des windowObjekts, da die gleichnamige Variable im Fensterbereich deklariert wurde. Dies funktioniert nur, wenn die Variable im Fensterbereich deklariert ist, nicht in einer Funktion / einem Abschluss.
Xoxox
2

Kurzer Weg, den ich bisher gefunden habe, um den Variablennamen als String zu erhalten:

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

const whatsMyName = "Snoop Doggy Dogg";

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

Sebastian Knopp
quelle
1

Dies funktionierte mit Internet Explorer (9, 10 und 11), Google Chrome 5:

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

Browserkompatibilitätstabelle:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

Danilo
quelle
Google Chrome 5? Ja wirklich??
avalanche1
2
@ avalanche1, gemäß MDN-Versionskompatibilitätstabelle.
Danilo
0

Ich habe diese Funktion basierend auf JSON erstellt, wie von jemandem vorgeschlagen, und funktioniert gut für meine Debug-Anforderungen

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

Igor Fomenko
quelle
-3

Nein, da ist kein.
Wenn Sie schreiben können variablesName(myFirstName), kennen Sie außerdem bereits den Variablennamen ("myFirstName").

täuschen
quelle
11
Nicht unbedingt wahr, wenn der Code minimiert wird;)
Geheime
9
Die Verwendung von z. B. nameof(myVariable)in C # (die eine Zeichenfolge "myVariable" zurückgibt, besteht auch darin, sich vor Fehlern beim Refactoring oder bei anderen Änderungen am Code zu schützen. Ein häufiger Anwendungsfall besteht darin, den Namen der Variablen zu einer Fehlermeldung hinzuzufügen, die ausgelöst wird Die meisten Teile halte ich für String-Literale als Code-Geruch und vermute, dass zumindest Visual Studio sie deshalb in einer rot / orange Farbe anzeigt. Ich weiß, ich weiß, diese Frage bezieht sich auf Javascript, aber ich habe nur erklärt, warum ich hier geendet habe.
Merrr
var test = 1235125142; console.log (Object.keys ({test}). pop ()) // "test"
bluejayke
1
@bluejayke Nenn mich ignorant, aber nach 8 Jahren sehe ich immer noch nicht, wie das besser ist als console.log('test')oder wann du es wirklich brauchst.
Täuschung