Nombre de variable como una cadena en Javascript

7 minutos de lectura

Nombre de variable como una cadena en Javascript
patata de pescado

¿Hay alguna forma de obtener un nombre de variable como una cadena en Javascript? (me gusta NSStringFromSelector en Cacao)

Me gustaría hacer así:

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

--> myFirstName:John

ACTUALIZAR

Estoy tratando de conectar un navegador y otro programa usando JavaScript. Me gustaría enviar nombres de instancias desde un navegador a otro programa para el método de devolución de llamada:

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

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

...

De otro programa:

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

En PHP: ¿Cómo obtener un nombre de variable como una cadena en PHP?

  • @delnan De hecho, +1. No se me ocurre otra forma de expresarlo que “si puedes escribir variablesName(myFirstName)ya sabes el nombre de la variable.” Lo intento, pero no puedo…

    – deceze

    5 de enero de 2011 a las 8:51

  • ¿Engañar? stackoverflow.com/questions/417645/…

    – ben

    5 de enero de 2011 a las 8:52


  • tal vez para eso podría almacenar en una variable y luego convertirla a json, por ejemplo {“instanceA”: instanceA} y enviarla al servidor usando ajax o get/post call y que puede procesar en php y obtener el nombre de la instancia …

    – Geomorillo

    26 de marzo de 2014 a las 0:44


  • @deceze, claro, conoce el nombre, pero eso no significa que pueda/quiera escribirlo manualmente. Tal vez desee volcar un montón de variables con fines de depuración y no tenga ganas de escribir manualmente console.log("myvar = " + myvar); una y otra vez, para cada variable.

    – Synetech

    6 de octubre de 2019 a las 15:13

Nombre de variable como una cadena en Javascript
donas

Me gusta la respuesta de Seth, pero usa Object.keys() en lugar de:

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

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

  • @titusfx puede cambiar const por let o var y funciona igual. Pero si está utilizando un transpiler para la desestructuración del objeto en primer lugar, probablemente ya sea compatible con const.

    – Seth White

    12 de diciembre de 2017 a las 15:19

  • ¿Esto parece depender del uso de ES6?

    – O´Rooney

    22 de agosto de 2018 a las 5:35

  • @O’Rooney Sí, es específico de ES6.

    – Donas

    17 oct 2018 a las 18:33

  • excelente idea Con eso, podemos crear una función capaz de configurar múltiples salidas por valor, leyendo desde los argumentos de la terminal: const getArgs = (varObj:any) => { const keys = Object.keys(varObj); process.argv.slice(2).forEach((arg, i) => varObj[keys[i]] = arg); return varObj; }

    – Murilo Perrone

    1 de abril de 2021 a las 2:40


1646751735 205 Nombre de variable como una cadena en Javascript
Compañero extraño

Puede usar la siguiente solución para resolver su problema:

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

// returns "myFirstName"

  • Esta respuesta es similar a [@SethWhite’s] (stackoverflow.com/a/39669231/5876282) pero muy simplificado. ¡Gracias! @bluejayke Creo que esta respuesta llega años después de la respuesta original aceptada. Pero sí, actualmente este es el mejor, excepto tal vez el uso de “pop ()” que se sugiere a continuación

    – B Carlos H

    3 de junio de 2019 a las 14:44


  • ¿Es posible hacer una función que acepte variables e imprima su nombre? Intenté envolver su código dentro de una función, pero la identificación me devolvió el nombre que se usó como argumento

    – Wakan Tanka

    27 de febrero de 2020 a las 11:14

  • @WakanTanka Si crea una pregunta adecuada, la responderé allí.

    – Compañero extraño

    1 de marzo de 2020 a las 7:20

  • @WakanTanka no, eso no funcionaría. Como descubrió, solo imprimirá el nombre que le dé al argumento de la función. Creo que ayuda ver cómo una función de este tipo se compilaría con una especificación de Javascript más antigua. Puedes ver en este ejemplo (jsfiddle.net/bigpopakap/wq891ghr/2) que la sintaxis {variable} es simplemente la abreviatura de {variable: variable}, por lo que es imposible usar el nombre de variable de la función de llamada

    – bigpopakap

    8 de junio de 2020 a las 17:25

  • Cuidado: esto no funcionará si usa la refactorización automática en VS Code para cambiar el nombre myFirstName variable a myLastName, por ejemplo. Hará esto: Object.keys({ myFirstName: myLastName })[0];

    – Máximo Mazurok

    26 de agosto de 2021 a las 5:14


1646751737 810 Nombre de variable como una cadena en Javascript
karim79

Por lo general, usaría una tabla hash para una situación en la que desea asignar un nombre a algún valor y poder recuperar ambos.

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

  • Sin embargo, no responde la pregunta.

    – htafoya

    7 de noviembre de 2017 a las 22:14

  • @htafoya: Indirectamente, sí, todas las propiedades de obj se imprimen como name: value pares Pero el texto explicativo podría ser más claro.

    – Mate

    20 de abril de 2018 a las 9:23


  • @Mat Entiendo el código, pero generalmente la pregunta OP se usa para algo más complejo como asignaciones dinámicas donde puede seleccionar la variable de una cadena generada. O donde simplemente crear un diccionario para imprimir un valor es excesivo.

    – htafoya

    20 de abril de 2018 a las 13:59

  • @htafoya – sí, algo simple como nameof(varname) en C#.

    – Mate

    20/04/2018 a las 14:00

  • Creo que la única razón por la que “no responde la pregunta” es porque no comienza con “No puedes obtener el nombre de la constante o una variable en JavaScript. Lo más parecido a lo que quieres…”, como esta otra respuesta: stackoverflow.com/a/37393679

    – bigpopakap

    8 de junio de 2020 a las 17:15

En ES6, podrías escribir algo como:

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

No es realmente lo mejor que se ve, pero hace el trabajo.

Esto aprovecha la desestructuración de objetos de ES6.

Más información aquí: https://hacks.mozilla.org/2015/05/es6-en-profundidad-desestructurando/

Nombre de variable como una cadena en Javascript
trébol

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

Sin embargo, creo que deberías hacer como “karim79”

  • Esto solo funcionará en el alcance de la ventana (se rompe cuando está dentro de una función).

    – jpillora

    11 de julio de 2015 a las 5:01

  • De acuerdo, pero es lo más cercano a responder la pregunta del OP. Gj.

    – El Dembinski

    18/10/2016 a las 22:39

  • además, si está probando una primitiva, alertará todas las variables que tengan el mismo valor, o si dos variables tienen asignado el mismo objeto. Por ejemplo, si la primera línea fue x = 2; y = 2; o x = {a:1}; b = x; alertaría a cada uno de ellos

    – algoritmo

    5 de marzo de 2017 a las 6:54

  • Si quieres que esto funcione en un alcance de la función puede intentar usar el nombre de la función en lugar de la ventana, como: var foo = function f(){ f.x = 2; for(o in f){ if(f[o]===f.x) alert(o); } } entonces llamando f() alertará a ‘x’

    – algoritmo

    14/03/2017 a las 18:51


  • @aljgom – buen punto. Aquí está un violín para probarlo

    – Mate

    20 de abril de 2018 a las 9:20

1646751738 989 Nombre de variable como una cadena en Javascript
Juangui Jordán

Probablemente pop sería mejor que indexar con [0]por seguridad (la variable puede ser nula).

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

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

  • Esto solo funcionará en el alcance de la ventana (se rompe cuando está dentro de una función).

    – jpillora

    11 de julio de 2015 a las 5:01

  • De acuerdo, pero es lo más cercano a responder la pregunta del OP. Gj.

    – El Dembinski

    18/10/2016 a las 22:39

  • además, si está probando una primitiva, alertará todas las variables que tengan el mismo valor, o si dos variables tienen asignado el mismo objeto. Por ejemplo, si la primera línea fue x = 2; y = 2; o x = {a:1}; b = x; alertaría a cada uno de ellos

    – algoritmo

    5 de marzo de 2017 a las 6:54

  • Si quieres que esto funcione en un alcance de la función puede intentar usar el nombre de la función en lugar de la ventana, como: var foo = function f(){ f.x = 2; for(o in f){ if(f[o]===f.x) alert(o); } } entonces llamando f() alertará a ‘x’

    – algoritmo

    14/03/2017 a las 18:51


  • @aljgom – buen punto. Aquí está un violín para probarlo

    – Mate

    20 de abril de 2018 a las 9:20

1646751739 500 Nombre de variable como una cadena en Javascript
BrunoLM

Esto funciona para expresiones básicas.

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

Ejemplo

nameof(() => options.displaySize);

Retazo:

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

  • ¡Esto realmente funciona bastante bien! el único problema es cuando pasas algo como esto: nameof(() => options.subOptions.displaySize) que devuelve “subOptions” En su lugar, usé esta expresión regular: exp.toString().match(/(?=[^.]*$)(\w+)/g)[0]

    –Jim Brown

    29 de noviembre de 2016 a las 21:54


  • Obtengo indefinido de: var a={b:”c”}; alerta(nombre(a)); nombre de la función (exp) { exp.toString().match(/(?=[^.]*$)(\w+)/g)[0]; } // nombre

    –David Spector

    2 sep 2019 a las 12:55

  • @JimBrown, ¡gracias! tu comentario necesita marcar como respuesta!

    – evorios

    7 de noviembre de 2019 a las 0:53

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad