Javascript中作为字符串的变量名
有没有办法在Javascript中以字符串形式获取变量名?(如中所示) 我想这样做:Javascript中作为字符串的变量名,javascript,Javascript,有没有办法在Javascript中以字符串形式获取变量名?(如中所示) 我想这样做: var myFirstName = 'John'; alert(variablesName(myFirstName) + ":" + myFirstName); --> myFirstName:John function testAlert(ta) { a = window[ta]; alert(ta + ': ' + a); } var height = 120; testAle
var myFirstName = 'John';
alert(variablesName(myFirstName) + ":" + myFirstName);
--> myFirstName:John
function testAlert(ta)
{
a = window[ta];
alert(ta + ': ' + a);
}
var height = 120;
testAlert("height");
// displays: height: 120
更新 我正在尝试使用JavaScript连接一个浏览器和另一个程序。我想将实例名称从浏览器发送到另一个程序,用于回调方法:
FooClass = function(){};
FooClass.someMethod = function(json) {
// Do something
}
instanceA = new FooClass();
instanceB = new FooClass();
doSomethingInAnotherProcess(instanceB); // result will be substituted by using instanceB.someMethod();
...
从另一个程序:
evaluateJavascriptInBrowser("(instanceName).someMethod("resultA");");
在PHP中:
不,没有。此外,如果您可以编写
变量名称(myFirstName)
,那么您已经知道变量名称(“myFirstName”)。通常,在需要将名称映射到某个值的情况下,您会使用哈希表,并能够检索两者
var obj={myFirstName:'John'};
obj.foo=‘另一个名字’;
用于(输入obj)
log(key+':'+obj[key])
您可以在中反思类型并获得属性和方法的名称,但您需要的是类似.NET中的Lambda表达式树
,我认为这是不可能的,因为javascript中的动态特性和缺乏静态类型系统
var x = 2;
for(o in window){
if(window[o] === x){
alert(o);
}
}
但是,我认为您应该像“karim79”一样,当让一个函数编写一个改变不同全局变量值的函数时,它并不总是我的名字,它是所有经过的函数。试试这个对我有用 磨合
将写入窗口“jack”。因为可以使用ECMAScript 5.1从对象获取所有属性的名称 以下是一个例子:
//获取John的属性(名字、姓氏)
var john={firstName:'john',lastName:'Doe'};
var属性=Object.keys(john);
//展示约翰的财产
var message='John的属性是:'+properties.join(',');
文件。书写(信息)代码>这适用于基本表达式
const nameof = exp => exp.toString().match(/[.](\w+)/)[1];
范例
nameof(() => options.displaySize);
片段:
var nameof=function(exp){return exp.toString().match(/[.](\w+/)[1];};
var myFirstName='Chuck';
var varname=nameof(函数(){return window.myFirstName;});
console.log(varname)代码>在ES6中,您可以编写如下内容:
let myVar = 'something';
let nameObject = {myVar};
let getVarNameFromObject = (nameObject) => {
for(let varName in nameObject) {
return varName;
}
}
let varName = getVarNameFromObject(nameObject);
这不是最好看的东西,但它完成了任务
这利用了ES6的对象分解
更多信息:我需要这个,不想使用对象,并提出了以下解决方案,扭转了这个问题
我没有将变量名转换为字符串,而是将字符串转换为变量。
当然,这只有在变量名已知的情况下才有效
拿这个来说:
var height = 120;
testAlert(height);
这应显示:
height: 120
可以这样做:
var myFirstName = 'John';
alert(variablesName(myFirstName) + ":" + myFirstName);
--> myFirstName:John
function testAlert(ta)
{
a = window[ta];
alert(ta + ': ' + a);
}
var height = 120;
testAlert("height");
// displays: height: 120
因此,我使用字符串“height”
,并使用window[]
命令将其转换为变量height
与Seth的答案相似,但使用了Object.keys()
:
const varToString=varObj=>Object.keys(varObj)[0]
常数someVar=42
const displayName=varToString({someVar})
console.log(显示名称)
这无法生成函数,因为它返回函数变量的名称
// THIS DOESN'T WORK
function getVarName(v) {
return Object.keys({v})[0];
}
// Returns "v"
编辑:谢谢你的帮助
您需要使用包含变量的单元素数组调用函数<代码>调试变量({somefancyvariable})代码>
编辑:对象。在我测试过的每个浏览器中,键可以作为键引用,但根据注释,它并不适用于任何地方。您可以使用以下解决方案来解决问题:
const myFirstName = 'John'
Object.keys({myFirstName})[0]
// returns "myFirstName"
出于安全考虑(变量可能为null),pop可能比使用[0]索引要好
使用Internet Explorer(9、10和11)、Google Chrome 5:
var myFirstName=“Danilo”;
var varName=Object.keys({myFirstName:0})[0];
console.log(varName)代码>到目前为止,我找到了以字符串形式获取变量名称的最短方法:
const name=obj=>Object.keys(obj)[0];
const whatsMyName=“Snoop Doggy Dogg”;
log(“变量名为:”+name({whatsMyName}));
//结果:变量名是:whatsMyName
我根据某人的建议基于JSON创建了这个函数,可以很好地满足我的调试需求
函数debugVar(varNames){
设strX=“”;
函数替换程序(键、值){
如果(值===未定义){返回“未定义”}
返回值
}
for(设参数arg){
让lastChar;
如果(参数类型!=“字符串”){
让_arg=JSON.stringify(arg,replacer);
_arg=_arg.replace('{','');
_arg=_arg.replace('}',“”);
_arg=_arg.replace(/:/g,“=”);
_arg=_arg.replace(/“/g,”);
strX+=\u arg;
}否则{
strX+=arg;
lastChar=arg[arg.length-1];
}
if(arg!==arguments[arguments.length-1]&&lastChar!==“:”){strX+=”“};
}
控制台日志(strX)
}
设a=42,b=3,c;
debugVar(“Begin:”,{a,b,c},“end”)
使用Object.keys()的最佳方法
获取全局范围内多变量名称的示例
// multi varibles for testing
var x = 5 , b = true , m = 6 , v = "str";
// pass all varibles you want in object
function getVarsNames(v = {}){
// getting keys or names !
let names = Object.keys(v);
// return array has real names of varibles
return names;
}
//testing if that work or not
let VarsNames = getVarsNames({x , b , m , v});
console.log(VarsNames); // output is array [x , b , m , v]
从任何有效的Javascript(变量、类)获取字符串:
示例:
nameOf(() => myVariable) // myVariable
nameOf(() => myVariable.name) // myVariable.name
nameOf(() => myVariable.name.length) // myVariable.name.length
nameOf(() => myVariable.name[10]) // myVariable.name[10]
nameOf(() => MySuperClass) // MySuperClass
如果你想找一些又快又脏的东西,这可能有用:
var zox = 150;
cl("zox");
function cl(c) {
console.log(c + ': ' + this[c]); // zox: 150
}
@delnan的确,+1.我想不出另外一种说法,除了“如果你能写变量名(myFirstName)
,你已经知道变量名了。”我正在尝试,但我不能…复制?也许你可以把它存储在一个变量中,然后将它转换成json,例如{“instanceA”:instanceA}然后使用ajax或get/post调用将其发送到服务器,您可以用php处理并获取实例的名称…@deceze,当然,您知道名称,但这并不意味着您可以/希望手动键入它。也许您希望转储一组变量以进行调试,而不想手动键入console.log(“myvar=“+myvar)代码>一次又一次,针对每个变量。我不认为JS比lambdas或函数式编程的相关工具差。但我认为在.NET.N中没有与表达式树等效的结构
const nameOf = (f) => (f).toString().replace(/[ |\(\)=>]/g,'');
nameOf(() => myVariable) // myVariable
nameOf(() => myVariable.name) // myVariable.name
nameOf(() => myVariable.name.length) // myVariable.name.length
nameOf(() => myVariable.name[10]) // myVariable.name[10]
nameOf(() => MySuperClass) // MySuperClass
var zox = 150;
cl("zox");
function cl(c) {
console.log(c + ': ' + this[c]); // zox: 150
}