Nome della variabile come stringa in Javascript


154

C'è un modo per ottenere un nome di variabile come stringa in Javascript? (come NSStringFromSelectornel cacao )

Vorrei fare così:

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

--> myFirstName:John

AGGIORNARE

Sto cercando di connettere un browser e un altro programma utilizzando JavaScript. Vorrei inviare i nomi di istanza da un browser a un altro programma per il metodo di callback:

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

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

...

Da un altro programma:

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

In PHP: Come ottenere un nome di variabile come stringa in PHP?


2
@delnan Effettivamente, +1. Non riesco a pensare a un altro modo di dirlo se non "se riesci a scrivere variablesName(myFirstName), conosci già il nome della variabile". Ci sto provando, ma non posso ...
Inganno


1
forse per questo potresti archiviare in una variabile e successivamente convertirlo in json ad esempio {"istanzaA": istanzaA} e inviarlo al server usando ajax o ottenere / postare una chiamata e che puoi elaborare in php e ottenere il nome dell'istanza ...
Geomorillo,

@deceze, certo, conosci il nome, ma ciò non significa che puoi / vuoi inserirlo manualmente. Forse vuoi scaricare un mucchio di variabili per scopi di debug e non hai voglia di digitare manualmente console.log("myvar = " + myvar);più e più volte, per ogni variabile.
Synetech,

Risposte:


54

In genere, si utilizza una tabella hash per una situazione in cui si desidera mappare un nome su un valore e si è in grado di recuperarli entrambi.

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


125
Non risponde alla domanda però.
htafoya,

1
@htafoya: indirettamente, sì - tutte le proprietà di objsono stampate come name: valuecoppie. Ma il testo esplicativo potrebbe essere più chiaro.
Matt,

1
@Mat Capisco il codice, ma generalmente la domanda OP viene utilizzata per qualcosa di più complesso come assegnazioni dinamiche in cui è possibile selezionare la variabile da una stringa generata. O dove semplicemente creare un dizionario per stampare un valore è eccessivo.
htafoya,

2
@htafoya - sì, qualcosa di semplice come nameof (varname) in C #.
Matt

1
Penso che l'unica ragione per cui "non risponde alla domanda" è perché non inizia con "Non puoi ottenere il nome della costante o una variabile in JavaScript. La cosa più vicina a ciò che vuoi ...", come quest'altra risposta: stackoverflow.com/a/37393679
bigpopakap

86

Come la risposta di Seth, ma usa Object.keys()invece:

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

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


5
@titusfx puoi scambiare const per let o var e funziona allo stesso modo. Ma se stai usando un transpiler per la distruzione dell'oggetto in primo luogo, probabilmente supporta già const.
Seth White

Questo sembra dipendere dall'uso di ES6?
O'Rooney,

1
@ O'Rooney Sì, è specifico per ES6.
Ciambelle,

63

È possibile utilizzare la seguente soluzione per risolvere il problema:

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

// returns "myFirstName"

3
Questa risposta è simile a [@ di SethWhite] ( stackoverflow.com/a/39669231/5876282 ), ma molto più semplificata. Grazie! @bluejayke Penso che questa risposta arrivi anni dopo la risposta originale accettata. Ma sì, attualmente questo è il migliore - tranne forse l'uso "pop ()" suggerito di seguito
B Charles H

1
è possibile fare una funzione che accetti la variabile e ne stampi il nome? Ho provato a racchiudere il tuo codice all'interno di una funzione ma id mi ha restituito il nome che è stato usato come argomento
Wakan Tanka

@WakanTanka Se crei una domanda corretta, risponderò lì.
Fellow Stranger,

@WakanTanka no, non funzionerebbe. Come hai scoperto, stamperà semplicemente il nome assegnato all'argomento della funzione. Penso che aiuti a vedere come una tale funzione si comporterebbe in una specifica Javascript precedente. In questo esempio ( jsfiddle.net/bigpopakap/wq891ghr/2 ) puoi vedere che la sintassi di {variabile} è solo breve per {variabile: variabile}, quindi è impossibile usare il nome della variabile dalla funzione chiamante
bigpopakap

42

In ES6, potresti scrivere qualcosa del tipo:

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

Non è davvero la cosa più bella, ma fa il lavoro.

Ciò sfrutta la destrutturazione degli oggetti di ES6.

Maggiori informazioni qui: https://hacks.mozilla.org/2015/05/es6-in-depth-destructuring/


1
Bella risposta!! Questo particolare uso della distruzione degli oggetti è nuovo per me (la riga 2 è let nameObject = {myVar}così utile! Non sembra essere documentata da nessuna parte. Hai dei collegamenti?
Laurence Lord,

2
@LaurenceLord si chiama stenografia della proprietà. L'assegnazione di una proprietà dell'oggetto senza una definizione (qualcosa: 'asdf'), farà sì che JS definisca la proprietà con il nome della variabile e il suo valore {qualcosa} === {qualcosa: qualcosa}. ariya.io/2013/02/…
SethWhite

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

Tuttavia, penso che dovresti fare come "karim79"


8
Funzionerà solo nell'ambito della finestra (si interrompe quando all'interno di una funzione).
jpillora,

1
D'accordo - ma è il più vicino a rispondere alla domanda del PO. Gj.
Il Dembinski il

anche se stai testando una primitiva, avviserà tutte le variabili che hanno lo stesso valore o se a due variabili è assegnato lo stesso oggetto. Ad esempio, se la prima riga fosse x = 2; y = 2;o x = {a:1}; b = x;avrebbe avvisato ognuno di loro
aljgom

Se vuoi che funzioni nell'ambito della funzione , puoi provare a usare il nome della funzione anziché la finestra, ad esempio: var foo = function f(){ f.x = 2; for(o in f){ if(f[o]===f.x) alert(o); } }quindi la chiamata f()avviserà 'x'
aljgom

1
@aljgom - buon punto. Ecco un violino per provarlo.
Matt,

16

Questo funziona per le espressioni di base

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

Esempio

nameof(() => options.displaySize);

Frammento:

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


2
In realtà funziona abbastanza bene! l'unico problema è quando passi qualcosa del genere: nameof (() => options.subOptions.displaySize) che restituisce "subOptions" Invece, ho usato questo regex: exp.toString (). match (/ (? = [^ .] * $) (\ w +) / g) [0]
Jim Brown,

Vengo indefinito da: var a = {b: "c"}; alert (nome (a)); nome funzione (exp) {exp.toString (). match (/ (? = [^.] * $) (\ w +) / g) [0]; } // nome
David Spector,

@JimBrown, grazie! il tuo commento deve essere contrassegnato come risposta!
evorios

14

Probabilmente pop sarebbe meglio che indicizzare con [0], per sicurezza (la variabile potrebbe essere nulla).

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

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

3
Se myFirstName viene passato a una funzione (contenente questo codice) come argomento v, variabileName viene riportato come v anziché myFirstName.
David Spector,

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

Questo non può essere trasformato in una funzione poiché restituisce il nome della variabile della funzione.

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

Modifica: grazie a @Madeo per aver sottolineato come trasformarlo in una funzione .

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

Sarà necessario chiamare la funzione con un array a singolo elemento contenente la variabile. debugVar({somefancyvariable});
Modifica: Object.keyspuò essere referenziato come keysin tutti i browser in cui l'ho provato ma secondo i commenti non funziona dappertutto.


Errore: "Impossibile trovare le chiavi variabili"
Alexander Volkov,

le chiavi non sono definite
valanga1

1
dovrebbe essere così const getVarName = (v) => Object.keys(v)[0];e quindi chiamare la funzione in questo modogetVarName({whatEverVariable})
Madeo

6

Da ECMAScript 5.1 è possibile utilizzare Object.keys per ottenere i nomi di tutte le proprietà da un oggetto.

Ecco un esempio:

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

Quando una funzione scrive una funzione che cambia i diversi valori delle variabili globali, non è sempre il mio nome, è qualunque cosa accada. Prova questo ha funzionato per me.

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

Scriverà alla finestra "jack".


2
Questo non è affidabile. Potrebbe esserci un numero qualsiasi di variabili sull'oggetto finestra con lo stesso valore.
Taylor Buchanan,

2

Puoi riflettere sui tipi in JavaScript e ottenere il nome di proprietà e metodi, ma ciò di cui hai bisogno è come Lambda Expressions Treesin .NET, penso che non sia possibile a causa della natura dinamica e della mancanza di un sistema di tipi statici in JavaScript.


3
Non penso che JS sia a corto di lambda o strumenti correlati di programmazione funzionale.

Ma penso che non ci sia una struttura equivalente a Expression Trees in .NET.
Jahan,

2

Ne avevo bisogno, non volevo usare oggetti e ho trovato la seguente soluzione, ribaltando la domanda.

Invece di convertire il nome della variabile in una stringa, converto una stringa in una variabile.

Funziona solo se il nome della variabile è noto ovviamente.

Prendi questo:

var height = 120;
testAlert(height);

Questo dovrebbe visualizzare:

height: 120

Questo può essere fatto in questo modo:

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

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

Quindi uso la stringa "height"e la trasformo in una variabile heightusando il window[]comando.


2
Nel secondo caso, height è una proprietà windowdell'oggetto poiché la variabile con lo stesso nome è stata dichiarata nell'ambito della finestra. Funziona solo se la variabile è dichiarata nell'ambito della finestra, non in una funzione / chiusura.
Xoxox,

2

Modo breve che ho trovato finora per ottenere il nome delle variabili come stringa:

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

const whatsMyName = "Snoop Doggy Dogg";

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



0

Ho creato questa funzione sulla base di JSON come qualcuno ha suggerito, funziona bene per le mie esigenze di debug

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

No non c'è.
Inoltre, se riesci a scrivere variablesName(myFirstName), conosci già il nome della variabile ("myFirstName").


11
Non necessariamente vero se il codice viene minimizzato;)
Segreto

9
Anche il punto di usare, ad esempio, nameof(myVariable)in C # (che restituisce una stringa "myVariable" è proteggere dagli errori durante il refactoring o apportare altre modifiche al codice. Un caso d'uso comune è aggiungere il nome della variabile a un messaggio di errore che viene generato. la maggior parte delle parti che considero letterali stringa un odore di codice, e sospetto che sia per questo che almeno Visual Studio le mostri in un colore rosso / arancione. So di sapere che questa domanda riguarda Javascript, ma ho appena spiegato perché sono finito qui.
martedì

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

1
@bluejayke Chiamami ignorante, ma dopo 8 anni non riesco ancora a vedere come sia meglio di console.log('test')o quando ne avresti davvero bisogno.
Inganno
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.