2011-01-05 17 views
74

¿Hay alguna forma de obtener un nombre de variable como una cadena en Javascript? (Como NSStringFromSelector en Cocoa)Nombre de la variable como una cadena en Javascript

me gustaría hacer como esto:

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

--> myFirstName:John 

- añadió

Estoy tratando de conectar un navegador y otro programa usando JavaScript. Me gustaría enviar nombres de instancia de 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: How to get a variable name as a string in PHP?

+1

I de la función cree que esto es un canidate para la etiqueta 'confusion-of-ideas' [propuesta previamente] (http://stackoverflow.com/questions/58640/great-programming-quotes/59001#59001). – delnan

+1

@delnan De hecho, +1. No se me ocurre otra forma de expresarlo que "si puedes escribir' variablesName (myFirstName) ', ya conoces el nombre de la variable". Lo estoy intentando, pero no puedo ... – deceze

+2

Dupe? http: // stackoverflow.com/questions/417645/how-to-convert-variable-name-to-string-in-javascript – Ben

Respuesta

38

Normalmente, utilizaría una tabla hash para una situación en la que desea asignar un nombre a un valor y poder recuperar ambos.

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

+0

Gracias. Está cerca de lo que quiero hacer. –

+3

No responde la pregunta. – htafoya

0

No, no lo hay.
Además, si puede escribir variablesName(myFirstName), ya conoce el nombre de la variable ("myFirstName").

+7

No necesariamente verdadero si el código está siendo minificado;) – Secret

+4

También el punto de usar, por ejemplo 'nameof (myVariable)' en C# (que devuelve una cadena "myVariable" es para protegerse contra errores al refactorizar o realizar otros cambios en el código. Un caso de uso común es agregar el nombre de la variable a un mensaje de error que se lanza. la mayoría de las partes considero que los literales de cadenas tienen un olor a código, y sospecho que es por eso que al menos Visual Studio los muestra en color rojo/naranja. Sé que lo sé, esta pregunta es sobre Javascript, pero acabo de explicar por qué terminé aquí. – merrr

1

Puede reflexionar sobre los tipos de javascript y obtener el nombre de propiedades y métodos, pero lo que necesita es algo como Lambda Expressions Trees en .NET, yo creo que no es ser posible debido a naturaleza dinámica y falta de sistema de tipo estático en javascript.

+3

No creo que JS no cumpla lambdas o herramientas relacionadas de programación funcional. – delnan

+0

Pero creo que no existe una estructura equivalente a Expression Trees en .NET. –

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

Sin embargo, creo que debe hacer como "karim79"

+5

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

+0

De acuerdo, pero es lo más cercano a responder las preguntas del OP ción. Gj. –

+0

también si está probando una primitiva, alertará a todas las variables que tienen el mismo valor, o si dos variables tienen el mismo objeto asignado a ellas. Por ejemplo, si la primera línea era 'x = 2; y = 2; 'o' x = {a: 1}; b = x; 'alertaría a cada uno de ellos – aljgom

2

Al tener una función de escribir una función que cambia diferentes valores de las variables globales no siempre se myfirstname es cualquier cosa que esté de paso. Intenta esto funcionó para mí.

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

Escribir en la ventana 'jack'.

+1

Esto no es confiable. Puede haber cualquier cantidad de variables en el objeto ventana con el mismo valor. –

6

Desde ECMAScript 5.1 puede usar Object.keys para obtener los nombres de todas las propiedades de un objeto.

Aquí se muestra un ejemplo:

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

8

Esto funciona para expresiones básicas

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

Ejemplo

nameof(() => options.displaySize); 

Fragmento:

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

+0

¡Esto realmente funciona bastante bien! el único problema es cuando se pasa en algo como esto: nombredel (() => options.subOptions.displaySize) que devuelve "sub-opciones" En su lugar, utiliza esta expresión regular:.? exp.toString() partido (/ (= [^.] * $) (\ w +)/g) [0] –

15

En ES6, que podría escribir algo como:

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

realmente la mejor cosa de aspecto, pero hace el trabajo.

Esto aprovecha desestructuración objeto de ES6.

Más información aquí: https://hacks.mozilla.org/2015/05/es6-in-depth-destructuring/

+1

¡¡¡Gran respuesta !!! –

2

que necesitaba esto, no quiero usar objetos, y se acercó con la siguiente solución, girando en torno a la cuestión.

En lugar de convertir el nombre de la variable en una cadena, convierto una cadena en una variable.

Esto solo funciona si se conoce el nombre de la variable, por supuesto.

Tome este:

var height = 120; 
testAlert(height); 

Esto debería mostrar:

height: 120 

Esto se puede hacer de esta manera:

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

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

Así que utilizar la cadena "height" y convertir eso en una variable height usando el comando window[].

+1

En su segundo caso, la altura es una propiedad del objeto 'window' porque la variable del mismo nombre se declaró en el ámbito de la ventana. Esto funciona * solo * si la variable se declara en el alcance de la ventana, no en una función/cierre. – xoxox

12

Como respuesta de Seth, pero utiliza Object.keys() lugar:

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

const someVar = 42 
const displayName = varToString({someVar}) 
+0

esta solución solo funciona con const – titusfx

+0

@titusfx puede cambiar const para let o var y funciona de la misma manera. Pero si está utilizando un transpiler para la desestructuración de objetos en primer lugar, probablemente ya lo esté. – SethWhite

3
var somefancyvariable = "fancy"; 
keys({somefancyvariable})[0]; 

esto no es capaz de hacer en una función que devuelve el nombre de la variable

//THIS DOESN'T WORK 
function getVarName(v) { 
    return keys({v})[0]; 
} 
//returns "v" 
Cuestiones relacionadas