Tên biến dưới dạng chuỗi trong Javascript


154

Có cách nào để lấy tên biến thành một chuỗi trong Javascript không? (như NSStringFromSelectortrong ca cao )

Tôi muốn làm như thế này:

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

--> myFirstName:John

CẬP NHẬT

Tôi đang cố gắng kết nối một trình duyệt và một chương trình khác bằng JavaScript. Tôi muốn gửi tên ví dụ từ trình duyệt đến một chương trình khác cho phương thức gọi lại:

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

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

...

Từ một chương trình khác:

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

Trong PHP: Làm thế nào để có được một tên biến như một chuỗi trong PHP?


2
@del Nam Thật vậy, +1. Tôi không thể nghĩ ra một cách khác để đặt nó hơn là "nếu bạn có thể viết variablesName(myFirstName), bạn đã biết tên biến." Tôi đang cố gắng, nhưng tôi không thể ...
lừa dối


1
có lẽ vì điều đó bạn có thể lưu trữ trong một biến và sau đó chuyển đổi nó thành json, ví dụ {"instanceA": instanceA} và gửi nó đến máy chủ bằng cách sử dụng ajax hoặc get / post cuộc gọi và bạn có thể xử lý bằng php và lấy tên của cá thể ...
Geomorillo

@deceze, chắc chắn, bạn biết tên, nhưng điều đó không có nghĩa là bạn có thể / muốn nhập nó bằng tay. Có thể bạn muốn kết xuất một loạt các biến cho mục đích gỡ lỗi và không cảm thấy như gõ thủ công console.log("myvar = " + myvar);nhiều lần cho mỗi biến.
Synetech

Câu trả lời:


54

Thông thường, bạn sẽ sử dụng bảng băm cho một tình huống mà bạn muốn ánh xạ tên tới một giá trị nào đó và có thể truy xuất cả hai.

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


124
Không trả lời câu hỏi mặc dù.
htafoya

1
@htafoya: Một cách gián tiếp, có - tất cả các thuộc tính của objđược in dưới dạng name: valuecặp. Nhưng văn bản giải thích có thể rõ ràng hơn.
Matt

1
@Mat Tôi hiểu mã, nhưng nói chung, câu hỏi OP được sử dụng cho một cái gì đó phức tạp hơn như các bài tập động nơi bạn có thể chọn biến từ một chuỗi được tạo. Hoặc khi chỉ cần tạo một từ điển để in một giá trị là quá mức cần thiết.
htafoya

2
@htafoya - vâng, một cái gì đó đơn giản như nameof (varname) trong C #.
Matt

1
Tôi nghĩ lý do duy nhất "không trả lời câu hỏi" này là vì nó không bắt đầu bằng "Bạn không thể lấy tên của hằng hoặc biến trong JavaScript. Điều gần nhất với những gì bạn muốn ...", như câu trả lời khác này: stackoverflow.com/a/37393679
bigpopakap

86

Giống như câu trả lời của Seth, nhưng sử dụng Object.keys()thay thế:

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

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


5
@titusfx bạn có thể trao đổi const cho let hoặc var và nó hoạt động như nhau. Nhưng nếu bạn đang sử dụng một bộ chuyển mã cho việc phá hủy đối tượng ở vị trí đầu tiên, thì có lẽ nó đã hỗ trợ const rồi.
SethWhite

Điều này dường như phụ thuộc vào việc sử dụng ES6?
O'Rooney

1
@ O'Rooney Vâng, đó là ES6 cụ thể.
Bánh rán

63

Bạn có thể sử dụng giải pháp sau để giải quyết vấn đề của mình:

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

// returns "myFirstName"

3
Câu trả lời này tương tự như [@ SethWhite's] ( stackoverflow.com/a/39669231/5876282 ) nhưng được đơn giản hóa nhiều. Cảm ơn! @bluejayke Tôi nghĩ rằng câu trả lời này xuất hiện nhiều năm sau khi câu trả lời được chấp nhận ban đầu. Nhưng vâng, hiện tại đây là cách tốt nhất - ngoại trừ việc sử dụng "pop ()" được đề xuất bên dưới
B Charles H

1
Có thể tạo hàm chấp nhận biến và in tên của nó không? Tôi đã thử bọc mã của bạn bên trong một hàm nhưng id trả lại cho tôi tên được sử dụng làm đối số
Wakan Tanka

@WakanTanka Nếu bạn tạo một câu hỏi thích hợp, tôi sẽ trả lời nó ở đó.
Người lạ mặt

@WakanTanka không, điều đó sẽ không hoạt động. Khi bạn phát hiện ra, nó sẽ chỉ in tên bạn đưa ra đối số hàm. Tôi nghĩ rằng nó giúp để xem làm thế nào một chức năng như vậy sẽ biên dịch thành một thông số Javascript cũ hơn. Bạn có thể thấy trong ví dụ này ( jsfiddle.net/bigpopakap/wq891ghr/2 ) rằng cú pháp {biến} chỉ viết tắt cho {biến: biến}, vì vậy không thể sử dụng tên biến từ hàm gọi
bigpopakap

42

Trong ES6, bạn có thể viết một cái gì đó như:

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

Không thực sự là điều tốt nhất, nhưng nó hoàn thành công việc.

Điều này thúc đẩy việc phá hủy đối tượng của ES6.

Thêm thông tin tại đây: https://hacks.mozilla.org/2015/05/es6-in-depth-desturationuring/


1
Câu trả lời chính xác!! Cách sử dụng đặc biệt này để hủy hoại đối tượng là mới đối với tôi (dòng 2 let nameObject = {myVar}rất hữu ích! Nó dường như không được ghi lại ở bất cứ đâu. Có liên kết nào không?
Laurence Lord

2
@LaurenceLord nó được gọi là tốc ký tài sản. Việc chỉ định một thuộc tính đối tượng không có định nghĩa (một cái gì đó: 'asdf'), sẽ khiến cho JS xác định thuộc tính với tên của biến và giá trị của nó {Something} === {Something: Something}. ariya.io/2013/02/ từ
SethWhite 19/12/18

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

Tuy nhiên, tôi nghĩ bạn nên làm như "karim79"


8
Điều này sẽ chỉ hoạt động ở phạm vi cửa sổ (phá vỡ khi bên trong một chức năng).
jpillora

1
Đồng ý - nhưng là cách gần nhất để trả lời câu hỏi của OP. Gj.
Dembinski

ngoài ra nếu bạn đang kiểm tra một nguyên thủy, nó sẽ cảnh báo tất cả các biến có cùng giá trị hoặc nếu hai biến có cùng một đối tượng được gán cho chúng. Ví dụ: nếu dòng đầu tiên là x = 2; y = 2;hoặc x = {a:1}; b = x;nó sẽ cảnh báo cho từng người trong số họ
aljeim

Nếu bạn muốn nó hoạt động trong phạm vi chức năng, bạn có thể thử sử dụng tên hàm thay vì cửa sổ, như: var foo = function f(){ f.x = 2; for(o in f){ if(f[o]===f.x) alert(o); } }sau đó gọi f()sẽ cảnh báo 'x'
aljeim

1
@aljeim - điểm tốt. Đây là một mẹo để thử nó.
Matt

16

Điều này làm việc cho các biểu thức cơ bản

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

Thí dụ

nameof(() => options.displaySize);

Đoạn trích:

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


2
Điều này thực sự hoạt động khá tốt! vấn đề duy nhất là khi bạn chuyển qua một cái gì đó như thế này: nameof (() => Options.subOptions.displaySize) trả về "subOptions" Thay vào đó, tôi đã sử dụng regex này: exp.toString (). match (/ (? = [^ .] * $) (\ w +) / g) [0]
Jim Brown

Tôi nhận được không xác định từ: var a = {b: "c"}; cảnh báo (tên (a)); tên hàm (exp) {exp.toString (). match (/ (? = [^.] * $) (\ w +) / g) [0]; } // tên
David Spector

@JimBrown, cảm ơn! bình luận của bạn cần đánh dấu là câu trả lời!
evorios

14

Có lẽ pop sẽ tốt hơn so với lập chỉ mục với [0], vì sự an toàn (biến có thể là null).

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

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

3
Nếu myFirstName được truyền cho một hàm (chứa mã này) dưới dạng đối số v, thì biếnName được báo cáo là v thay vì myFirstName.
David Spector

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

Điều này không thể được tạo thành một hàm vì nó trả về tên của biến của hàm.

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

Edit: Nhờ @Madeo cho chỉ ra làm thế nào để thực hiện điều này vào một chức năng .

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

Bạn sẽ cần gọi hàm với một mảng phần tử duy nhất chứa biến. debugVar({somefancyvariable});
Chỉnh sửa: Object.keyscó thể được tham chiếu như chỉ keystrong mọi trình duyệt tôi đã thử nghiệm nhưng theo các nhận xét thì nó không hoạt động ở mọi nơi.


Lỗi: "Không thể tìm thấy khóa biến"
Alexander Volkov

các khóa không được xác định
avalanche1

1
nó phải như thế này const getVarName = (v) => Object.keys(v)[0];và sau đó gọi hàm như thế nàygetVarName({whatEverVariable})
Madeo

6

Kể từ ECMAScript 5.1, bạn có thể sử dụng Object.keys để lấy tên của tất cả các thuộc tính từ một đối tượng.

Đây là một ví dụ:

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

Khi có một hàm viết một hàm thay đổi các giá trị biến toàn cục khác nhau, nó không phải luôn luôn là tên của tôi, đó là bất cứ điều gì xảy ra để đi qua. Hãy thử điều này làm việc cho tôi.

Chạy trong 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));

Sẽ ghi vào cửa sổ 'jack'.


2
Điều này không đáng tin cậy. Có thể có bất kỳ số lượng biến nào trên đối tượng cửa sổ có cùng giá trị.
Taylor Hội trưởng

2

Bạn có thể phản ánh về các loại trong javascript và lấy tên của các thuộc tính và phương thức nhưng những gì bạn cần là giống như Lambda Expressions Treestrong .NET, tôi nghĩ rằng điều đó là không thể do tính chất động và thiếu hệ thống loại tĩnh trong javascript.


3
Tôi không nghĩ rằng JS thiếu lambdas hoặc các công cụ liên quan đến lập trình chức năng.

Nhưng tôi nghĩ không có cấu trúc tương đương với Cây biểu hiện trong .NET.
Jahan

2

Tôi cần điều này, không muốn sử dụng các đối tượng và đưa ra giải pháp sau đây, chuyển câu hỏi xung quanh.

Thay vì chuyển đổi tên biến thành một chuỗi, tôi chuyển đổi một chuỗi thành một biến.

Điều này chỉ hoạt động nếu tên biến được biết tất nhiên.

Thực hiện việc này:

var height = 120;
testAlert(height);

Điều này sẽ hiển thị:

height: 120

Điều này có thể được thực hiện như thế này:

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

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

Vì vậy, tôi sử dụng chuỗi "height"và biến nó thành một biến heightbằng cách sử dụng window[]lệnh.


2
Trong trường hợp thứ hai của bạn, height là một thuộc tính của windowđối tượng vì biến cùng tên được khai báo ở phạm vi cửa sổ. Điều này chỉ hoạt động nếu biến được khai báo ở phạm vi cửa sổ, không phải trong hàm / đóng.
xoxox

2

Cách quần short tôi đã tìm thấy cho đến nay để có được tên biến như một chuỗi:

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

const whatsMyName = "Snoop Doggy Dogg";

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


1

Điều này hoạt động bằng Internet Explorer (9, 10 và 11), Google Chrome 5:

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

Bảng tương thích trình duyệt:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys


Google Chrome 5? có thật không??
tuyết lở1

2
@ avalanche1, theo bảng tương thích phiên bản MDN.
danilo

0

Tôi đã tạo hàm này dựa trên JSON như ai đó đã đề xuất, hoạt động tốt cho nhu cầu gỡ lỗi của tôi

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

Không có.
Ngoài ra, nếu bạn có thể viết variablesName(myFirstName), bạn đã biết tên biến ("myFirstName").


11
Không nhất thiết đúng nếu mã được rút gọn;)
Bí mật

9
Ngoài ra, điểm sử dụng, ví dụ như nameof(myVariable)trong C # (trả về chuỗi "myVariable" là để bảo vệ chống lại lỗi khi tái cấu trúc hoặc thực hiện các thay đổi khác cho mã. Trường hợp sử dụng phổ biến là thêm tên biến vào thông báo lỗi. Hầu hết các phần tôi coi chuỗi ký tự là mùi mã và nghi ngờ đó là lý do tại sao ít nhất là Visual Studio, hiển thị chúng có màu đỏ / cam. Tôi biết tôi biết, câu hỏi này là về Javascript, nhưng tôi chỉ giải thích tại sao tôi kết thúc ở đây.
merrr

kiểm tra var = 1235125142; console.log (Object.keys ({test}). pop ()) // "test"
bluejayke

1
@bluejayke Gọi tôi là không biết gì, nhưng sau 8 năm tôi vẫn không thấy điều đó tốt hơn console.log('test')hay khi bạn thực sự cần nó.
lừa dối
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.