Nama variabel sebagai string dalam Javascript

154

Apakah ada cara untuk mendapatkan nama variabel sebagai string di Javascript? (seperti NSStringFromSelectordalam Kakao )

Saya ingin melakukan ini:

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

--> myFirstName:John

MEMPERBARUI

Saya mencoba menghubungkan browser dan program lain menggunakan JavaScript. Saya ingin mengirim nama contoh dari browser ke program lain untuk metode panggilan balik:

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

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

...

Dari program lain:

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

Di PHP: Bagaimana cara mendapatkan nama variabel sebagai string di PHP?

kentang ikan
sumber
2
@delnan Memang, +1. Saya tidak bisa memikirkan cara lain untuk mengatakannya daripada "jika Anda bisa menulis variablesName(myFirstName), Anda sudah tahu nama variabelnya." Saya mencoba, tetapi saya tidak bisa ...
tipuan
1
mungkin untuk itu Anda bisa menyimpan dalam variabel dan kemudian mengubahnya menjadi json misalnya {"instanceA": instanceA} dan mengirimkannya ke server menggunakan ajax atau panggilan get / post dan Anda dapat memproses dalam php dan mendapatkan nama instance ...
Geomorillo
@ menerima, tentu saja, Anda tahu namanya, tetapi itu tidak berarti Anda bisa / ingin mengetiknya secara manual. Mungkin Anda ingin membuang banyak variabel untuk keperluan debugging dan tidak merasa seperti mengetik secara manual console.log("myvar = " + myvar);berulang-ulang, untuk setiap variabel.
Synetech

Jawaban:

54

Biasanya, Anda akan menggunakan tabel hash untuk situasi di mana Anda ingin memetakan nama ke beberapa nilai, dan dapat mengambil keduanya.

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

karim79
sumber
125
Namun tidak menjawab pertanyaan.
htafoya
1
@ hafoya: Secara tidak langsung, ya - semua properti objdicetak sebagai name: valuepasangan. Tetapi teks yang menjelaskan bisa lebih jelas.
Matt
1
@ Mat Saya mengerti kode, tetapi umumnya pertanyaan OP digunakan untuk sesuatu yang lebih kompleks sebagai tugas dinamis di mana Anda dapat memilih variabel dari string yang dihasilkan. Atau di mana hanya membuat kamus untuk mencetak nilai terlalu banyak.
htafoya
2
@htafoya - ya, sesuatu yang sederhana seperti nameof (varname) di C #.
Matt
1
Saya pikir satu-satunya alasan ini "tidak menjawab pertanyaan" adalah karena itu tidak dimulai dengan "Anda tidak bisa mendapatkan nama konstanta atau variabel dalam JavaScript. Hal terdekat dengan apa yang Anda inginkan ...", seperti jawaban lain ini: stackoverflow.com/a/37393679
bigpopakap
86

Suka jawaban Seth, tetapi gunakan Object.keys()sebaliknya:

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

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

Donat
sumber
5
@titusfx Anda dapat menukar const untuk let atau var dan kerjanya sama saja. Tetapi jika Anda menggunakan transpiler untuk merusak objek di tempat pertama, itu mungkin sudah mendukung const.
SethWhite
Ini tampaknya tergantung pada penggunaan ES6?
O'Rooney
1
@ O'Rooney Ya, ini adalah ES6 spesifik.
Donat
63

Anda dapat menggunakan solusi berikut untuk menyelesaikan masalah Anda:

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

// returns "myFirstName"
Sesama Asing
sumber
3
Jawaban ini mirip dengan [@ SethWhite's] ( stackoverflow.com/a/39669231/5876282 ) tetapi sangat disederhanakan. Terima kasih! @bluejayke Saya pikir jawaban ini datang bertahun-tahun kemudian setelah jawaban asli diterima. Tapi ya, saat ini adalah yang terbaik - kecuali mungkin penggunaan "pop ()" yang disarankan di bawah ini
B Charles H
1
apakah mungkin membuat fungsi yang akan menerima variabel dan mencetak namanya? Saya sudah mencoba membungkus kode Anda di dalam suatu fungsi tetapi id mengembalikan saya nama yang digunakan sebagai argumen
Wakan Tanka
@WakanTanka Jika Anda membuat pertanyaan yang tepat, saya akan menjawabnya di sana.
Fellow Stranger
@WakanTanka tidak, itu tidak akan berhasil. Ketika Anda menemukan, itu hanya akan mencetak nama yang Anda berikan argumen fungsi. Saya pikir ini membantu untuk melihat bagaimana fungsi seperti itu dikompilasi ke spesifikasi Javascript yang lebih lama. Anda dapat melihat dalam contoh ini ( jsfiddle.net/bigpopakap/wq891ghr/2 ) bahwa sintaks {variabel} hanya kependekan dari {variabel: variabel}, jadi tidak mungkin untuk menggunakan nama variabel dari fungsi panggilan
bigpopakap
42

Di ES6, Anda dapat menulis sesuatu seperti:

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

Bukan hal yang benar-benar terlihat terbaik, tapi itu menyelesaikan pekerjaan.

Ini memanfaatkan objek destruksi ES6.

Info lebih lanjut di sini: https://hacks.mozilla.org/2015/05/es6-in-depth-destrukturisasi/

SethWhite
sumber
1
Jawaban bagus !! Penggunaan khusus penghancuran objek ini baru bagi saya (baris 2 let nameObject = {myVar}sangat berguna! Tampaknya tidak didokumentasikan di mana pun. Punya tautan?
Laurence Lord
2
@LaurenceLord itu disebut steno properti. Menetapkan properti objek tanpa definisi (sesuatu: 'asdf'), akan menyebabkan JS mendefinisikan properti dengan nama variabel dan nilainya {sesuatu} === {sesuatu: sesuatu}. ariya.io/2013/02/…
SethWhite
19
var x = 2;
for(o in window){ 
   if(window[o] === x){
      alert(o);
   }
}

Namun, saya pikir Anda harus melakukan seperti "karim79"

semanggi
sumber
8
Ini hanya akan bekerja pada lingkup jendela (rusak ketika di dalam suatu fungsi).
jpillora
1
Setuju - tetapi yang paling dekat dengan menjawab pertanyaan OP. Gj.
The Dembinski
juga jika Anda menguji primitif, itu akan mengingatkan semua variabel yang memiliki nilai yang sama, atau jika dua variabel memiliki objek yang sama yang ditugaskan kepadanya. Misalnya jika baris pertama adalah x = 2; y = 2;atau x = {a:1}; b = x;akan memperingatkan mereka masing-masing
aljgom
Jika Anda ingin ini berfungsi dalam lingkup fungsi, Anda dapat mencoba menggunakan nama fungsi alih-alih jendela, seperti: var foo = function f(){ f.x = 2; for(o in f){ if(f[o]===f.x) alert(o); } }lalu menelepon f()akan mengingatkan 'x'
aljgom
1
@aljgom - poin bagus. Ini biola untuk mencobanya.
Matt
16

Ini berfungsi untuk ekspresi dasar

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

Contoh

nameof(() => options.displaySize);

Potongan:

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

BrunoLM
sumber
2
Ini sebenarnya bekerja cukup baik! satu-satunya masalah adalah ketika Anda memasukkan sesuatu seperti ini: nameof (() => options.subOptions.displaySize) yang mengembalikan "subOptions" Alih-alih, saya menggunakan regex ini: exp.toString (). match (/ (? = [^ .] * $) (\ w +) / g) [0]
Jim Brown
Saya tidak terdefinisi dari: var a = {b: "c"}; lansiran (nama (a)); nama fungsi (exp) {exp.toString (). pertandingan (/ (? = [^.] * $) (\ w +) / g) [0]; } // nama
David Spector
@ JimBrown, terima kasih! komentar Anda harus ditandai sebagai jawaban!
evorios
14

Mungkin pop akan lebih baik daripada pengindeksan dengan [0], untuk keamanan (variabel mungkin nol).

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

// returns "Variable myFirstName with value 'John'"
Juangui Jordán
sumber
3
Jika myFirstName dilewatkan ke fungsi (berisi kode ini) sebagai argumen v, maka variableName dilaporkan sebagai v bukan myFirstName.
David Spector
9
var somefancyvariable = "fancy";
Object.keys({somefancyvariable})[0];

Ini tidak dapat dibuat menjadi fungsi karena mengembalikan nama variabel fungsi.

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

Sunting: Terima kasih kepada @Madeo karena telah menunjukkan cara menjadikan ini sebagai fungsi .

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

Anda perlu memanggil fungsi dengan array elemen tunggal yang berisi variabel. debugVar({somefancyvariable});
Sunting: Object.keysdapat dirujuk hanya keysdi setiap browser tempat saya mengujinya tetapi menurut komentar itu tidak berfungsi di mana-mana.

Cadiboo
sumber
Kesalahan: "Tidak dapat menemukan kunci variabel"
Alexander Volkov
kunci tidak ditentukan
avalanche1
1
harus seperti ini const getVarName = (v) => Object.keys(v)[0];dan kemudian memanggil fungsinya seperti inigetVarName({whatEverVariable})
Madeo
6

Karena ECMAScript 5.1 Anda dapat menggunakan Object.keys untuk mendapatkan nama semua properti dari suatu objek.

Berikut ini sebuah contoh:

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

Benny Neugebauer
sumber
4

Ketika memiliki fungsi tulislah sebuah fungsi yang mengubah nilai variabel global yang berbeda itu tidak selalu myfirstname itu adalah apa pun yang terjadi. Coba ini berhasil untuk saya.

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

Akan menulis ke jendela 'jack'.

Matt Smith
sumber
2
Ini tidak bisa diandalkan. Mungkin ada sejumlah variabel pada objek jendela dengan nilai yang sama.
Taylor Buchanan
2

Anda dapat merenungkan jenis dalam javascript dan mendapatkan nama properti dan metode tetapi apa yang Anda butuhkan adalah sth seperti Lambda Expressions Treesdalam. NET, saya pikir itu tidak mungkin karena sifat dinamis dan kurangnya sistem tipe statis di javascript.

Jahan
sumber
3
Saya tidak berpikir JS kekurangan lambdas atau alat terkait pemrograman fungsional.
Tapi saya pikir tidak ada struktur yang setara dengan Pohon Ekspresi di .NET.
Jahan
2

Saya membutuhkan ini, tidak ingin menggunakan objek, dan datang dengan solusi berikut, membalikkan pertanyaan.

Alih-alih mengubah nama variabel menjadi string, saya mengubah string menjadi variabel.

Ini hanya berfungsi jika nama variabel diketahui tentu saja.

Ambil ini:

var height = 120;
testAlert(height);

Ini akan menampilkan:

height: 120

Ini bisa dilakukan seperti ini:

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

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

Jadi saya menggunakan string "height"dan mengubahnya menjadi variabel heightmenggunakan window[]perintah.

SPRBRN
sumber
2
Dalam kasus kedua Anda, tinggi adalah properti windowobjek karena variabel dari nama yang sama dideklarasikan pada lingkup jendela. Ini hanya berfungsi jika variabel dideklarasikan pada lingkup jendela, bukan dalam fungsi / penutupan.
xoxox
2

Cara singkat yang saya temukan sejauh ini untuk mendapatkan nama variabel sebagai string:

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

const whatsMyName = "Snoop Doggy Dogg";

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

Sebastian Knopp
sumber
1

Ini berfungsi menggunakan Internet Explorer (9, 10 dan 11), Google Chrome 5:

   
var myFirstName = "Danilo";
var varName = Object.keys({myFirstName:0})[0];
console.log(varName);

Tabel kompatibilitas browser:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

danilo
sumber
Google Chrome 5? Betulkah??
avalanche1
2
@ avalanche1, sesuai dengan tabel kompatibilitas versi MDN.
danilo
0

Saya telah membuat fungsi ini berdasarkan JSON seperti yang disarankan seseorang, berfungsi dengan baik untuk kebutuhan debug saya

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

Igor Fomenko
sumber
-3

Tidak, tidak ada.
Selain itu, jika Anda bisa menulis variablesName(myFirstName), Anda sudah tahu nama variabel ("myFirstName").

tipuan
sumber
11
Belum tentu benar jika kode sedang dikecilkan;)
Rahasia
9
Juga titik penggunaan misalnya nameof(myVariable)dalam C # (yang mengembalikan string "myVariable" adalah untuk melindungi dari kesalahan ketika refactoring atau membuat perubahan lain pada kode. Kasus penggunaan umum adalah menambahkan nama variabel ke pesan kesalahan yang dilemparkan. Untuk itu sebagian besar saya menganggap string string sebagai bau kode, dan curiga itulah sebabnya setidaknya Visual Studio, menunjukkannya dalam warna merah / oranye. Saya tahu saya tahu, pertanyaan ini tentang Javascript, tapi saya hanya menjelaskan mengapa saya berakhir di sini.
merrr
uji var = 1235125142; console.log (Object.keys ({test}). pop ()) // "test"
bluejayke
1
@bluejayke Panggil saya bodoh, tapi setelah 8 tahun saya masih gagal melihat bagaimana itu lebih baik dari console.log('test')atau ketika Anda benar-benar membutuhkannya.
tipuan