2011-01-05 78 views
74

有沒有辦法在Javascript中獲取變量名稱作爲字符串? (如NSStringFromSelector在可可)作爲Javascript中的字符串的變量名稱

我想這樣做:

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

--> myFirstName:John 

- 添加

我嘗試連接瀏覽器並使用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: How to get a variable name as a string in PHP?

+1

我的名字相信這是「混淆思想」標籤的一個問題[先前提出](http://stackoverflow.com/questions/58640/great-programming-quotes/59001#59001)。 – delnan 2011-01-05 08:46:29

+1

@delnan的確,+1。我想不出另一種方式來比它「如果你可以寫'variablesName(myFirstName)',你已經知道變量名。」我正在嘗試,但我不能... – deceze 2011-01-05 08:51:09

+2

Dupe? HTTP://計算器。com/questions/417645/how-to-convert-variable-name-to-string-in-javascript – Ben 2011-01-05 08:52:00

回答

38

通常情況下,對於想要將名稱映射到某個值並能夠檢索兩者的情況,您將使用散列表。

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

+0

謝謝,它接近我想要做的 – 2011-01-05 09:06:09

+3

雖然沒有回答這個問題 – htafoya 2017-11-07 22:14:55

0

沒有,沒有。
此外,如果您可以編寫variablesName(myFirstName),則您已經知道變量名稱(「myFirstName」)。

+7

如果代碼被縮小,則不一定爲真;) – Secret 2014-02-10 09:16:06

+4

此外,使用eg在C#中的'nameof(myVariable)'(返回一個字符串「myVariable」)是爲了防止在重構或對代碼進行其他更改時出現錯誤。常見用例是將變量的名稱添加到拋出的錯誤消息中。大多數部分我認爲字符串文字是一種代碼味道,並且懷疑這就是爲什麼至少Visual Studio以紅色/橙色顯示它們。我知道我知道,這個問題是關於Javascript的,但我只是解釋了爲什麼我在這裏結束。 – merrr 2016-01-28 13:15:11

1

可以在javascript的類型反映和獲得的屬性和方法,但名稱你需要的是像Lambda Expressions Trees在.NET某事,我認爲這是不可能的,由於動態性和JavaScript中缺乏靜態類型系統。

+3

我不認爲JS沒有達到lambdas或函數式編程的相關工具 – delnan 2011-01-05 08:55:15

+0

但我認爲沒有與表達式樹在.NET中 – 2016-02-16 12:04:10

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

不過,我認爲你應該做的像「karim79」

+5

這隻會在窗口範圍內工作(在函數內部時會中斷) – jpillora 2015-07-11 05:01:37

+0

同意 - 但最接近回答OP的問題灰。 GJ。 – 2016-10-18 22:39:55

+0

如果你正在測試一個原語,它會提醒所有具有相同值的變量,或者如果兩個變量有相同的對象分配給它們。例如,如果第一行是'x = 2; y = 2;'或'x = {a:1}; b = x;'它會提醒每個人 – aljgom 2017-03-05 06:54:18

2

當具有功能編寫不同的改變全局變量的值並不總是myfirstname是無論發生什麼事被途經的功能。試試這對我有效。

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

將寫入窗口'jack'。

+1

這是不可靠的。在窗口對象上可能有任何數量的變量具有相同的值。 – 2015-12-02 16:39:24

6

由於ECMAScript 5.1您可以使用Object.keys從對象中獲取所有屬性的名稱。

下面是一個例子:

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

這適用於基本的表達

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(function() { return window.myFirstName; }); 
 
console.log(varname);

+0

這實際上工作得很好! (()=> options.subOptions.displaySize)返回「subOptions」 而是,我用這個正則表達式:exp.toString()。match(/(?= [^。] * $)(\ w +)/ g)[0] – 2016-11-29 21:54:05

15

在ES6,你可以寫這樣的:

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

算不上最好看的東西,但它能夠完成任務。

這利用了ES6的對象解構。

此處瞭解詳情:https://hacks.mozilla.org/2015/05/es6-in-depth-destructuring/

+1

很好的回答! – 2017-07-25 11:54:39

2

我需要這個,不希望使用對象,並用以下解決方案來了,轉過來的問題。

不是將變量名稱轉換爲字符串,而是將字符串轉換爲變量。

這隻適用於變量名是否已知。

藉此:

var height = 120; 
testAlert(height); 

這應該顯示:

height: 120 

這可以這樣做:

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

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

所以我使用的字符串"height",並把它轉換成一個變量height使用window[]命令。

+1

在第二種情況下,height是'window'對象的一個​​屬性,因爲在窗口範圍內聲明瞭同名變量。這僅適用於*如果變量是在窗口範圍聲明的,而不是在函數/閉包中聲明的。 – xoxox 2016-12-11 09:17:58

12

像塞特的答案,但使用Object.keys()代替:

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

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

此解決方案僅適用於const – titusfx 2017-09-07 14:50:51

+0

@titusfx,您可以將let或var替換爲const,它的工作原理與此相同。但是如果你首先使用一個轉譯器來解析對象,那麼它可能已經支持const了。 – SethWhite 2017-12-12 15:19:37

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

這是不能夠被製作成一個函數,它返回函數的變量

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