Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中作为字符串的变量名_Javascript - Fatal编程技术网

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

有没有办法在Javascript中以字符串形式获取变量名?(如中所示)

我想这样做:

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    
}