simo - javascript variable google tag manager
Javascript: referencia un nombre de variable de la propia variable (6)
Solución - (para su caso de uso real) - console.log({foo})
En ES6 IdentifierReference
s se aceptan como PropertyDefinition
s en la ObjectLiteral
de ObjectLiteral
( ver tabla de compatibilidad ):
El nombre de la variable se establece en la key
Property
del Object
.
y el valor de la variable se establece en el value
Property
del Object
.
Como console.log
muestra los Object
con sus key
y value
Propertiy
, puede usarlos para ver el nombre y el valor de su variable invocando console.log({foo})
.
Tenga en cuenta que cuando inicializa un único
object
anónimo con varias variables, como hice en el segundoconsole.log
mientras aparecen en el mismo orden en que se inicializaron aquí en la salida del fragmento, se pueden reordenar (alfabéticamente) en otro lugar.
var testint = 3
var teststring = "hi"
var testarr = ["one", 2, (function three(){})]
var testobj = {4:"four", 5:"five", nested:{6:"six",7:"seven"}}
console.log({testint})
console.log({testint, teststring, testarr, testobj})
Respuesta - (al título de la pregunta) - Object.keys({foo})[0]
También puede usar este Object Initializer
abreviado junto con Object.keys()
para acceder directamente al nombre de la variable:
var name = "value"
console.log(Object.keys({name})[0])
Quiero crear una función rápida que console.log
un nombre de variable y el valor. Me gustaría que el resultado de la función se muestre en la consola: foo: bar
.
Mi idea básica para la función se ve así:
function varlog(var_name)
{
console.log(var_name + ": " + eval(var_name));
}
Y llamaría así es:
function someRandomFunction()
{
var foo = "bar";
// ... some stuff happens
varlog("foo");
}
Esto funciona si foo
es global, pero no funciona en el ejemplo proporcionado. Otra opción que también solo funciona globalmente es usar window[var_name]
lugar de la eval
miedo.
No creo que lo que pido sea posible, pero pensé que lo tiraría por ahí.
Estoy gastando mucho tiempo intentando ser perezoso. Mi método actual es solo console.log(''foo: '' + bar);
que funciona bien Pero ahora solo quiero saber si esto es posible.
Algunas otras preguntas a las que hice referencia en la búsqueda de esto / creando lo que tengo ahora:
- Nombre de variable como una cadena en Javascript
- ¿Cómo convertir el nombre de variable a cadena en JavaScript?
- Javascript, ¿se refiere a una variable que usa una cadena que contiene su nombre?
- Cómo encontrar la variable de JavaScript por su nombre
-
Edición: Me encantaría llamar a varlog(foo)
, si el nombre "foo" se puede derivar de la variable.
Aunque no estoy al tanto de tal posibilidad, quería compartir una pequeña idea:
Object.prototype.log = function(with_message) {
console.log(with_message + ":" + this);
}
var x = "string";
x.log("x");
Como he dicho, una pequeña idea.
La razón por la que no funciona es porque la variable foo
no es accesible a la función varlog
! foo
se declara en someRandomFunction, y nunca se pasa a varlog
, por lo que varlog
no tiene idea de cuál es la variable foo! Puede resolver este problema pasando la variable foo
a la función (o utilizando algún tipo de cierre para hacer que foo
esté en el ámbito de varlog
) junto con su representación de cadena, pero de lo contrario, creo que no tiene suerte.
Espero que esto ayude.
Me encantó la idea de @mhitza, así que la estoy haciendo un poco más grande ...
El inconveniente es la necesidad de utilizar .value
para alcanzar el contenido variable.
Object.prototype.log = function(message) {
if (message) console.log(this.name, this.value, message);
else console.log(this.name, this.value);
}
function nar (name, value) {
var o = {name: name, value: value};
this[name] = o;
return o;
}
// var globalVar = 1;
nar(''globalVar'', 1);
globalVar.log();
// > globalVar 1
globalVar.value += 5;
globalVar.log(''equal six'');
// > globalVar 6 equal six
var someFunction = function () {
// var localVar = 2;
nar(''localVar'', 2);
localVar.log(''someInfo'');
// > localVar 2 someInfo
};
someFunction();
No creo que lo que quieres hacer sea posible.
La mejor alternativa que se me ocurre es pasar un objeto a varlog
que es básicamente un hash de clave-valor:
function varlog(obj)
{
for (var varname in obj) {
console.log(varname + ": " + obj[varname]);
}
}
function someRandomFunction()
{
var foo = "bar";
// ... some stuff happens
varlog({foo: foo});
}
Tipo de combinación de un par de respuestas en una pequeña función.
Que este trabajo para usted?
const log = function() {
const key = Object.keys(this)[0];
const value = this[key];
console.log(`${key}: ${value}`);
}
let someValue = 2;
log.call({someVlaue}); //someValue: 2
Funciona con la función también, incluso a sí mismo.
log.call({log});
// It would return the following
log:function() {
const key = Object.keys(this)[0];
const value = this[key];
console.log(`${key}: ${value}`);
}