자바 스크립트에서 문자열로 변수 이름


154

Javascript에서 변수 이름을 문자열로 얻는 방법이 있습니까? (마음 NSStringFromSelector코코아 )

나는 이렇게하고 싶다 :

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에서 : PHP 에서 변수 이름을 문자열로 얻는 방법은 무엇입니까?


2
@delnan 실제로, +1. "만약 쓸 수 있다면 variablesName(myFirstName)이미 변수 이름을 알고 있다"는 것 외에는 다른 방법을 생각할 수 없습니다 . 노력하고 있지만 할 수 없습니다 ...
deceze


1
아마도 변수에 저장하고 나중에 { "instanceA": instanceA}와 같이 json으로 변환하고 ajax 또는 get / post 호출을 사용하여 서버로 보내면 PHP에서 처리하고 인스턴스 이름을 얻을 수 있습니다. ...
Geomorillo

@deceze, 확실히, 당신은 이름을 알고 있지만, 수동으로 입력 할 수 있음을 의미하지는 않습니다. 어쩌면 디버깅 목적으로 많은 변수를 덤프하고 console.log("myvar = " + myvar);각 변수에 대해 수동으로 반복해서 입력 하는 느낌이 들지 않을 수 있습니다 .
Synetech

답변:


54

일반적으로 이름을 특정 값에 매핑하고 두 가지를 모두 검색 할 수있는 상황에 해시 테이블을 사용합니다.

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


125
그래도 질문에 대답하지 않습니다.
htafoya

1
@htafoya : 간접적으로 그렇습니다. 모든 속성은 쌍 obj으로 인쇄됩니다 name: value. 그러나 설명 텍스트가 더 명확 할 수 있습니다.
Matt

1
@Mat 코드를 이해하지만 일반적으로 OP 질문은 생성 된 문자열에서 변수를 선택할 수있는 동적 할당과 같은 복잡한 작업에 사용됩니다. 또는 단순히 값을 인쇄하기 위해 사전을 만드는 것이 과도합니다.
htafoya

2
@htafoya-예, C #의 nameof (varname)과 같은 간단한 것입니다.
Matt

1
이것이 "질문에 답하지 않은"유일한 이유는 "자바 스크립트에서 상수 나 변수의 이름을 얻을 수 없습니다. 이 다른 답변 : stackoverflow.com/a/37393679
bigpopakap

86

Seth의 답변과 비슷하지만 Object.keys()대신 사용 합니다.

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

const someVar = 42
const displayName = varToString({ someVar })
console.log(displayName)


5
@titusfx let 또는 var에 대해 const를 바꿀 수 있으며 동일하게 작동합니다. 그러나 객체 디스트 럭처링을 위해 트랜스 파일러를 사용하고 있다면 const를 이미 지원하고있을 것입니다.
SethWhite

이것은 ES6 사용에 달려있는 것 같습니다.
O'Rooney

1
@ O'Rooney 예, ES6 전용입니다.
도넛

63

다음 솔루션을 사용하여 문제점을 해결할 수 있습니다.

const myFirstName = 'John'
Object.keys({myFirstName})[0]

// returns "myFirstName"

3
이 답변은 [@ SethWhite 's] ( stackoverflow.com/a/39669231/5876282 ) 와 비슷 하지만 훨씬 단순화되었습니다. 감사! @ bluejayke이 답변은 원래 수락 된 답변 후 몇 년 후에 온 것 같습니다. 그러나 예, 현재 이것이 최고입니다. 아래
B Charles H

1
변수를 받아들이고 이름을 인쇄하는 기능을 만들 수 있습니까? 함수 안에 코드를 감아 보았지만 id는 인자로 사용 된 이름을 반환했습니다.
Wakan Tanka

@WakanTanka 적절한 질문을 작성하면 거기에 대답하겠습니다.
동료 낯선 사람

@WakanTanka 아니오, 작동하지 않습니다. 발견 한대로 함수 인수에 지정한 이름 만 인쇄합니다. 그런 함수가 어떻게 오래된 Javascript 사양으로 컴파일되는지 보는 것이 도움이된다고 생각합니다. 이 예제 ( jsfiddle.net/bigpopakap/wq891ghr/2 )에서 {variable} 구문이 {variable : variable}의 약자이므로 호출 함수에서 변수 이름을 사용할 수 없습니다.
bigpopakap

42

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
좋은 대답 !! 객체가 자폭이 특정 용도 나 (에 새로운 라인이 let nameObject = {myVar}너무 유용한 그것은 어디 문서화하지 않는 것 어떤 링크가있어!.?
로렌스 주님

2
@LaurenceLord를 속기 속성이라고합니다. 정의없이 객체 속성을 할당하면 (뭔가 : 'asdf') JS가 변수 이름과 그 값 {something} === {something : something}으로 속성을 정의하게됩니다. ariya.io/2013/02/…
SethWhite

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

하지만 당신은 "karim79"를 좋아해야한다고 생각합니다


8
이것은 창 범위에서만 작동합니다 (함수 내부에서는 깨짐).
jpillora

1
동의-그러나 OP의 질문에 대답하는 데 가장 가깝습니다. j
Dembinski

또한 프리미티브를 테스트하는 경우 동일한 값을 가진 모든 변수 또는 두 개의 변수에 동일한 객체가 할당 된 경우 경고합니다. 예를 들어 첫 번째 줄이 x = 2; y = 2;되었거나 x = {a:1}; b = x;각각에 대해 경고하는 경우
aljgom

이것을 함수 범위 에서 작동 시키려면 var foo = function f(){ f.x = 2; for(o in f){ if(f[o]===f.x) alert(o); } }다음 과 같이 창 대신 함수 이름을 사용해보십시오. 그러면 다음 과 같이 호출 f()하면 'x'경고
aljgom

1
@aljgom-좋은 지적. 그것을 시도 하는 바이올린 이 있습니다.
Matt

16

이것은 기본 표현에 효과적입니다.

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


2
이것은 실제로 꽤 잘 작동합니다! 유일한 문제는 "subOptions"를 반환하는 nameof (() => options.subOptions.displaySize)와 같은 것을 전달할 때입니다. 대신, 나는이 정규식을 사용했습니다 : exp.toString (). match (/ (? = [^ .] * $) (\ w +) / g) [0]
Jim Brown

var a = {b : "c"}; 경고 (이름 (a)); 함수 이름 (exp) {exp.toString (). match (/ (? = [^.] * $) (\ w +) / g) [0]; } // 이름
David Spector

@JimBrown, 감사합니다! 귀하의 의견은 답변으로 표시해야합니다!
evorios

14

안전을 위해 pop은 [0]으로 인덱싱하는 것보다 낫습니다 (변수는 null 일 수 있음).

const myFirstName = 'John'
const variableName = Object.keys({myFirstName}).pop();
console.log(`Variable ${variableName} with value '${variable}'`);

// returns "Variable myFirstName with value 'John'"

3
myFirstName이 함수 v (이 코드 포함)에 인수 v로 전달되면 variableName이 myFirstName 대신 v로보고됩니다.
David Spector 2018 년

9
var somefancyvariable = "fancy";
Object.keys({somefancyvariable})[0];

함수 변수의 이름을 반환하므로 함수로 만들 수 없습니다.

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

편집 : 이것을 함수로 만드는 방법을 지적한 @Madeo 에게 감사드립니다 .

function debugVar(varObj) {
    var varName = Object.keys(varObj)[0];
    console.log("Var \"" + varName + "\" has a value of \"" + varObj[varName] + "\"");
}

변수를 포함하는 단일 요소 배열로 함수를 호출해야합니다. debugVar({somefancyvariable});
편집 : 테스트 한 모든 브라우저에서 Object.keys와 같이 참조 할 수 keys있지만 주석에 따르면 모든 곳에서 작동하지 않습니다.


오류 : "변수 키를 찾을 수 없습니다"
알렉산더 볼코프

키가 정의되어 있지 않음
눈사태 1

1
그것은 다음과 같이해야 const getVarName = (v) => Object.keys(v)[0];다음과 같이 함수를 호출getVarName({whatEverVariable})
Madeo

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


4

함수가 다른 전역 변수 값을 변경하는 함수를 작성할 때 항상 myfirstname이 아닌 것은 통과하는 일입니다. 이것이 나를 위해 노력하십시오.

jsfiddle 에서 실행

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

'잭'창에 씁니다.


2
이것은 신뢰할 수 없습니다. 동일한 값을 가진 창 개체에 여러 변수가있을 수 있습니다.
Taylor Buchanan

2

자바 스크립트 에서 유형을 반영하고 속성 및 메소드의 이름을 얻을 수 있지만 필요한 것은 Lambda Expressions Trees.NET에서 sth입니다. 동적 특성과 자바 스크립트의 정적 유형 시스템 부족으로 인해 가능하지 않다고 생각합니다.


3
JS가 람다 또는 함수형 프로그래밍 관련 도구가 부족하다고 생각하지 않습니다.

그러나 .NET에는 Expression Trees와 동등한 구조가 없다고 생각합니다.
Jahan

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"변수로 바꿉니다.heightwindow[]


2
두 번째 경우, window같은 이름의 변수가 창 범위에서 선언되었으므로 height는 객체 의 속성입니다 . 이것은 변수가 함수 / 클로저가 아닌 창 범위에서 선언 된 경우 에만 작동 합니다 .
xoxox

2

변수 이름을 문자열로 얻기 위해 지금까지 찾은 짧은 방법 :

const name = obj => Object.keys(obj)[0];

const whatsMyName = "Snoop Doggy Dogg";

console.log( "Variable name is: " + name({ whatsMyName }) );
//result: Variable name is: whatsMyName



0

누군가가 제안한대로 JSON을 기반 으로이 함수를 만들었으며 디버그 요구에 잘 작동합니다.

function debugVar(varNames){
let strX = "";
function replacer(key, value){
    if (value === undefined){return "undef"}
    return value
    }    
for (let arg of arguments){
let lastChar;
    if (typeof arg!== "string"){
        let _arg = JSON.stringify(arg, replacer);
        _arg = _arg.replace('{',"");
        _arg = _arg.replace('}',"");            
        _arg = _arg.replace(/:/g,"=");
        _arg = _arg.replace(/"/g,"");
        strX+=_arg;
    }else{
    strX+=arg;
    lastChar = arg[arg.length-1];
    }
    if (arg!==arguments[arguments.length-1]&&lastChar!==":"){strX+=" "};
}
console.log(strX)    
}
let a = 42, b = 3, c;
debugVar("Begin:",{a,b,c},"end")


-3

아니 없어.
게다가 쓸 수 있다면 variablesName(myFirstName)이미 변수 이름 ( "myFirstName")을 알고있는 것입니다.


11
코드가 축소되고있는 경우에 반드시 해당되는 것은 아닙니다.;)
Secret

9
또한 예를 들어 nameof(myVariable)C #에서 문자열 "myVariable"을 반환하는 것은 코드를 리팩토링하거나 다른 변경을 할 때 실수로부터 보호하는 것입니다. 일반적인 사용 사례는 발생하는 오류 메시지에 변수 이름을 추가하는 것입니다. 대부분의 부분은 문자열 리터럴을 코드 냄새라고 생각하기 때문에 적어도 Visual Studio에서 빨강 / 주황색으로 표시하는 것 같습니다.이 질문은 Javascript에 관한 것이지만 여기서 종료 한 이유를 설명했습니다.
merrr

var 테스트 = 1235125142; console.log (Object.keys ({test}). pop ()) // "test"
bluejayke 2014 년

1
@bluejayke 나에게 무식하다고 불러라. 그러나 8 년이 지난 후에도 나는 그것이 어떻게 그것이 더 좋은지 console.log('test')또는 정말로 필요 할지 여전히 알지 못한다 .
deceze
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.