Javascript'te dize olarak değişken adı


154

Javascript'te değişken ismi dize olarak almanın bir yolu var mı? (mi NSStringFromSelectorolarak kakao )

Bunu yapmak istiyorum:

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

--> myFirstName:John

GÜNCELLEME

JavaScript kullanarak bir tarayıcı ve başka bir program bağlamaya çalışıyorum. Bir tarayıcıdan geri arama yöntemi için başka bir programa örnek adları göndermek istiyorum:

FooClass = function(){};
FooClass.someMethod = function(json) {
  // Do something
}

instanceA = new FooClass();
instanceB = new FooClass();
doSomethingInAnotherProcess(instanceB); // result will be substituted by using instanceB.someMethod();

...

Başka bir programdan:

evaluateJavascriptInBrowser("(instanceName).someMethod("resultA");");

PHP'de: PHP'de dize olarak değişken bir ad nasıl alınır?


2
@delnan Gerçekten, +1. " variablesName(myFirstName)Yazabiliyorsanız, değişken adını zaten biliyorsunuz " ifadesinden başka bir yol düşünemiyorum . Deniyorum, ama yapamam ...
deceze


1
belki bunun için bir değişkende saklayabilir ve daha sonra onu {"instanceA": instanceA} gibi json'a dönüştürebilir ve ajax veya get / post çağrısı kullanarak sunucuya gönderebilir ve php içinde işleyebilir ve örneğin adını alabilirsiniz ...
Geomorillo

@deceze, elbette, adı biliyorsunuz, ancak bu, manuel olarak yazabileceğiniz / isteyebileceğiniz anlamına gelmiyor. Belki hata ayıklama amacıyla bir grup değişkeni dökmek istiyorsunuz console.log("myvar = " + myvar);ve her değişken için elle tekrar tekrar yazmak istemiyorsunuz .
Synetech

Yanıtlar:


54

Genellikle, bir adı bir değerle eşlemek ve her ikisini de almak istediğiniz bir durum için bir karma tablo kullanırsınız.

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


126
Yine de soruyu cevaplamıyor.
htafoya

1
@htafoya: Dolaylı olarak, evet - tüm özellikleri çift objolarak yazdırılır name: value. Ancak açıklayan metin daha açık olabilir.
Matt

1
@Mat Kodu anlıyorum, ancak genellikle OP sorusu, oluşturulmuş bir dizeden değişkeni seçebileceğiniz dinamik atamalar olarak daha karmaşık bir şey için kullanılır. Ya da sadece bir değeri yazdırmak için sözlük oluşturmanın aşırıya kaçması.
htafoya

2
@htafoya - evet, C # 'daki nameof (varname) gibi basit bir şey.
Matt

1
Bunun "soruyu cevaplamamasının" tek nedeni, "Sabit veya değişkenin adını JavaScript'te alamıyorsunuz. İstediğinize en yakın şey ..." bu diğer cevap: stackoverflow.com/a/37393679
bigpopakap

86

Seth'in cevabı gibi, ama Object.keys()bunun yerine kullanır :

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

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


5
@titusfx const let veya var için takas edebilirsiniz ve aynı şekilde çalışır. Ancak, ilk etapta nesne yıkımı için bir transpiler kullanıyorsanız, muhtemelen const'u zaten destekliyor.
SethWhite

Bu ES6 kullanmaya bağlı gibi görünüyor?
O'Rooney

1
@ O'Rooney Evet, ES6'ya özgü.
Donuts

63

Sorununuzu çözmek için aşağıdaki çözümü kullanabilirsiniz:

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

// returns "myFirstName"

3
Bu cevap [@ SethWhite's] ( stackoverflow.com/a/39669231/5876282 ) ile benzerdir, ancak çok basitleştirilmiştir. Teşekkürler! @bluejayke Bence bu cevap orijinal kabul edilen cevaptan yıllar sonra geliyor. Ama evet, şu anda bu en iyisi - belki aşağıda
B Charles H

1
Değişkeni kabul edecek ve ismini yazdıracak bir işlev yapmak mümkün müdür? Kodunuzu bir işlev içine sarmayı denedim ama id bana argüman olarak kullanılan adı döndürdü
Wakan Tanka

@WakanTanka Eğer uygun bir soru yaratırsanız, ben orada cevaplayacağım.
Yabancı

@WakanTanka hayır, bu işe yaramaz. Bulduğunuz gibi, yalnızca işlev bağımsız değişkenine verdiğiniz adı yazdıracaktır. Böyle bir fonksiyon eski bir Javascript spec için nasıl derlenir görmek için yardımcı olduğunu düşünüyorum. Bu örnekte ( jsfiddle.net/bigpopakap/wq891ghr/2 ) {değişken} sözdiziminin {değişken: değişken} için sadece kısa olduğunu görebilirsiniz, bu nedenle çağrı işlevindeki değişken adını kullanmak imkansızdır
bigpopakap

42

ES6'da şöyle bir şey yazabilirsiniz:

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

Gerçekten en iyi görünen şey değil, ama işi hallediyor.

Bu, ES6'nın nesne yıkımından yararlanır.

Daha fazla bilgi için: https://hacks.mozilla.org/2015/05/es6-in-depth-destructuring/


1
Mükemmel cevap!! Nesne yok etmenin bu özel kullanımı benim için yeni (2. satır let nameObject = {myVar}çok kullanışlı! Hiçbir yerde belgelenmemiş gibi görünüyor. Herhangi bir bağlantı var mı?)
Laurence Lord

2
@LaurenceLord kısaca mülk olarak adlandırılır. Tanım olmadan bir nesne özelliği atamak (bir şey: 'asdf'), JS'nin özelliği değişkenin adı ve değeri {something} === {bir şey: bir şey} ile tanımlamasına neden olur. ariya.io/2013/02/…
SethWhite

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

Ancak, sanırım "karim79" gibi yapmalısın


8
Bu sadece pencere kapsamında çalışır (bir fonksiyonun içindeyken kırılır).
jpillora

1
Kabul etti - ama OP'nin sorusunu cevaplamaya en yakın. Gj.
Dembinski

ayrıca bir ilkeli test ediyorsanız, aynı değere sahip tüm değişkenleri veya iki değişkenin kendilerine atanmış aynı nesneye sahip olması durumunda uyarır. Örneğin, ilk satır her birini x = 2; y = 2;x = {a:1}; b = x;
uyarırsa

Bunun bir işlev kapsamında çalışmasını istiyorsanız , pencere yerine işlev adını kullanmayı deneyebilirsiniz, örneğin: var foo = function f(){ f.x = 2; for(o in f){ if(f[o]===f.x) alert(o); } }çağrı f(), 'x'
uyarılır

1
@aljgom - iyi bir nokta. İşte denemek için bir keman .
Matt

16

Bu temel ifadeler için geçerlidir

const nameof = exp => exp.toString().match(/[.](\w+)/)[1];

Misal

nameof(() => options.displaySize);

Pasaj:

var nameof = function (exp) { return exp.toString().match(/[.](\w+)/)[1]; };
var myFirstName = 'Chuck';
var varname = nameof(function () { return window.myFirstName; });
console.log(varname);


2
Bu aslında çok iyi çalışıyor! tek sorun şuna benzer bir şey geçirdiğinizde: "subOptions" döndüren nameof (() => options.subOptions.displaySize) Bunun yerine, bu regex: exp.toString (). match (/ (? = [^ .] * $) (\ w +) / g) [0]
Jim Brown

Ben tanımsız olsun: var a = {b: "c"}; alert (isim (a)); işlev adı (exp) {exp.toString (). match (/ (? = [^.] * $) (\ w +) / g) [0]; } // name
David Spector

@JimBrown, teşekkürler! yorumunuz cevap olarak işaretlenmelidir!
evorios

14

Muhtemelen pop, güvenlik için [0] ile endekslemekten daha iyi olurdu (değişken boş olabilir).

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

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

3
MyFirstName, argüman v olarak bir işleve (bu kodu içeren) geçirilirse, değişkenAdı, myFirstName yerine v olarak bildirilir.
David Spector

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

Bu, işlev değişkeninin adını döndürdüğü için bir işleve dönüştürülemez.

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

Düzenleme: sayesinde @Madeo için bir işlev içine bu nasıl işaret .

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

İşlevi, değişkeni içeren tek bir öğe dizisiyle çağırmanız gerekir. debugVar({somefancyvariable});
Düzenleme: Object.keysSadece keystest ettiğim her tarayıcıda olduğu gibi referans verilebilir , ancak yorumlara göre her yerde çalışmaz.


Hata: "Değişken anahtarlar bulunamıyor"
Alexander Volkov

tuşları tanımlanmadı
avalanche1

1
bu şekilde olmalı const getVarName = (v) => Object.keys(v)[0];ve daha sonra böyle fonksiyonu çağırmalıdırgetVarName({whatEverVariable})
Madeo

6

ECMAScript 5.1'den beri , bir nesneden tüm özelliklerin adlarını almak için Object.keys komutunu kullanabilirsiniz .

İşte bir örnek:

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

Bir fonksiyona sahipken, farklı global değişken değerlerini değiştiren bir fonksiyon yazarken, her zaman myfirstname değildir. Bu benim için çalıştı deneyin.

Çalıştır 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));

Pencereye 'jack' yazacak.


2
Bu güvenilir değil. Pencere nesnesinde aynı değere sahip çok sayıda değişken olabilir.
Taylor Buchanan

2

Javascript türleri üzerinde Lambda Expressions Treesdüşünmek ve özellikleri ve yöntemleri adını alabilirsiniz ama ihtiyacınız .NET gibi sth olduğunu, ben dinamik doğası ve javascript statik tip sistemi eksikliği nedeniyle mümkün olmadığını düşünüyorum.


3
Ben JS lambdas veya ilgili programlama programlama araçları yetersiz olduğunu sanmıyorum.

Ama bence .NET'te İfade Ağaçlarına eşdeğer bir yapı yok.
Jahan

2

Buna ihtiyacım vardı, nesneleri kullanmak istemiyorum ve soruyu tersine çevirerek aşağıdaki çözümü buldum.

Değişken adını bir dizeye dönüştürmek yerine, bir dizeyi bir değişkene dönüştürürüm.

Bu yalnızca değişken adı elbette biliniyorsa işe yarar.

Bunu al:

var height = 120;
testAlert(height);

Bu aşağıdakileri göstermelidir:

height: 120

Bu şu şekilde yapılabilir:

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

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

Bu yüzden dizeyi kullanıyorum ve komutu kullanarak "height"bir değişkene dönüştürüyorum .heightwindow[]


2
İkinci durumda, windowaynı adın değişkeni pencere kapsamında bildirildiğinden , yükseklik nesnenin bir özelliğidir . Bu yalnızca değişken bir işlev / kapanışta değil, pencere kapsamında bildirilirse çalışır .
xoxox

2

Şort şu ana kadar bir dize olarak değişkenler adını almak için bulduk:

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

Birisi önerdiği gibi JSON dayalı bu işlevi oluşturdum, benim hata ayıklama ihtiyaçları için iyi çalışıyor

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

Hayır yok.
Ayrıca, yazabiliyorsanız variablesName(myFirstName), değişken adını zaten biliyorsunuzdur ("myFirstName").


11
Kod küçültülüyorsa mutlaka doğru değildir;)
Gizli

9
Ayrıca, örneğin nameof(myVariable)C # ("myVariable" dizesini döndüren nokta, yeniden düzenleme veya kodda başka değişiklikler yaparken hatalara karşı koruma sağlamaktır.Genel bir kullanım örneği, değişkenin adını atılan bir hata mesajına eklemektir. Ben dize düşünün çoğu parçalar bir kod koku Değişmez ve şüpheli Ben biliyorum bir kırmızı / turuncu renkte en az Visual Studio, gösteriler onlara bu soruyu JavaScript hakkında ama burada sona erdi sadece neden izah bunun nesi..
merrr

var testi = 1235125142; console.log (Object.keys ({test}). pop ()) // "test"
bluejayke

1
@bluejayke Bana cahil deyin, ancak 8 yıl sonra console.log('test')bunun gerçekten ihtiyacınız olandan veya ne zaman ihtiyacınız olduğunu göremiyorum .
deceze
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.