Các biến "có thể thay đổi" trong Javascript?


101

Tôi biết trong PHP có thể có các biến "biến". Ví dụ

$x = "variable";
$$x = "hello, world!";
echo $variable; // displays "hello, world!"

Có thể tham chiếu đến một biến theo tên của nó dưới dạng một chuỗi trong javascript không? Làm thế nào nó sẽ được thực hiện?


mảng không phải là biến, nếu bạn sử dụng mảng làm đối số hàm, trình thông dịch JS sẽ sử dụng một con trỏ đến mảng của bạn. Trong lập trình việc sử dụng từ ngữ nào đó là chính xác, và những gì bạn yêu cầu chỉ có ý nghĩa rất ít
Mister Jojo

Câu trả lời:


147

Không có giải pháp duy nhất cho điều này (tốt, có eval, nhưng chúng ta đừng xem xét nghiêm túc điều đó). Có thể truy cập động một số biến toàn cục thông qua window, nhưng điều đó không hoạt động đối với các biến cục bộ của một hàm. Các biến toàn cục không trở thành thuộc tính của windowlà các biến được định nghĩa với letconst, và classes.

Hầu như luôn luôn có một giải pháp tốt hơn là sử dụng các biến khả biến! Thay vào đó, bạn nên xem xét cấu trúc dữ liệu và chọn cấu trúc phù hợp cho vấn đề của mình.

Nếu bạn có một bộ tên cố định, chẳng hạn như

// BAD
var foo = 42;
var bar = 21;

var key = 'foo';
console.log(eval(key));

lưu trữ các tên / giá trị đó dưới dạng thuộc tính của một đối tượng và sử dụng ký hiệu dấu ngoặc để tra cứu động:

// GOOD
var obj = {
  foo: 42,
  bar: 21,
};

var key = 'foo';
console.log(obj[key]);

Trong ES2015 +, việc này thậm chí còn dễ dàng hơn đối với các biến hiện có bằng cách sử dụng ký hiệu thuộc tính ngắn gọn :

// GOOD
var foo = 42;
var bar = 21;
var obj = {foo, bar};

var key = 'foo';
console.log(obj[key]);


Nếu bạn có các biến được đánh số "liên tiếp", chẳng hạn như

// BAD
var foo1 = 'foo';
var foo2 = 'bar';
var foo3 = 'baz';

var index = 1;
console.log(eval('foo' + index));

thì bạn nên sử dụng một mảng để thay thế và chỉ cần sử dụng chỉ mục để truy cập giá trị tương ứng:

// GOOD
var foos = ['foo', 'bar', 'baz'];
var index = 1;
console.log(foos[index - 1]);


Ví dụ để xác định nhiều giá trị: var x = 1; var x, y = 2; x = 1; var x = 1, y = 2; var x = xx = 1; var y = x + x;
Amin Maleki,

42

Nếu bạn muốn làm điều này, bạn có thể thử sử dụng eval ():

var data = "testVariable";
eval("var temp_" + data + "=123;");
alert(temp_testVariable);

Hoặc sử dụng đối tượng cửa sổ:

var data = "testVariable";
window["temp_" + data] = 123;
alert(window["temp_" + data]);

http://www.hiteshagrawal.com/javascript/dynamic-variables-in-javascript


evalkhông thể tạo biến cục bộ trong chế độ nghiêm ngặt. Tuy nhiên, một lệnh gọi gián tiếp có thể tạo ra các biến toàn cục.
Oriol

4

Để tham chiếu một biến trong javascript chỉ với một chuỗi, bạn có thể sử dụng

window['your_variable_name']

Bạn có thể đặt và tham chiếu các biến cũng như các đối tượng trong biến.


4

Không giống như PHP, JavaScript không cung cấp quyền truy cập vào mảng cầu nối (chứa các tham chiếu đến tất cả các tên biến hiện được khai báo). Do đó, JavaScript không cung cấp hỗ trợ gốc cho các biến biến. Tuy nhiên, bạn có thể mô phỏng tính năng này miễn là bạn xác định tất cả các biến của mình như một phần của một mảng hoặc một đối tượng. Điều này sẽ lần lượt tạo ra một mảng Gloabls cho bạn. Ví dụ: thay vì khai báo biến hellotrong phạm vi toàn cục như sau:

var hello = 'hello world';

hãy đóng gói nó bên trong một đối tượng. Chúng tôi sẽ gọi đối tượng đó là vv (biến biến):

var vv = {
    'hello': 'hello world',
    //Other variable variables come here.
},
referToHello = 'hello';

Bây giờ chúng ta có thể tham chiếu đến biến bằng chỉ mục của nó và vì các chỉ mục mảng có thể được cung cấp bằng cách sử dụng một biến nên trên thực tế, chúng ta đang sử dụng một biến biến:

console.log(vv[referToHello]); //Output: hello world

Câu trả lời cho câu hỏi của bạn

Hãy áp dụng điều này cho mã bạn đã cung cấp trong câu hỏi ban đầu:

    var vv = {
        'x': 'variable',
        'variable': 'hello world!'
    };
    console.log(vv[vv['x']]); //Displays "hello, world!"

Sử dụng thực tế

Mặc dù đoạn mã trước đó có thể trông rất cồng kềnh và không thực tế, nhưng có những cách sử dụng thực tế cho các biến biến trong JavaScript bằng cách sử dụng kiểu đóng gói này. Trong ví dụ dưới đây, chúng tôi sử dụng cùng một khái niệm để lấy ID của một số phần tử HTML không xác định.

var elementIds = [],
        elements = ['message','fillOrStroke','sizePicker','colorPicker']; //The items in this array could be defined automatically via an input, database query, event, etc.
        elements.forEach( (element) => {
            elementIds[element] = document.getElementById(element);
        });

Ví dụ này khai báo các biến biến (khóa trong elementIds) dựa trên ID của mỗi phần tử và sẽ gán nút của phần tử đã nói làm giá trị của mỗi biến. Và vì việc sử dụng các biến toàn cục trong JavaScript nói chung không được khuyến khích việc cung cấp cho các biến biến của bạn một phạm vi duy nhất (trong trường hợp này là khai báo chúng bên trong elementIdsmảng) không chỉ gọn gàng mà còn có trách nhiệm hơn.


2

Tất nhiên bạn có thể, nhưng không. Các biến phải là toàn cục.

var killingFunction = 'alert'
var killMeNow = 'please'
var please = 'You have been killed!'
this[killingFunction](this[killMeNow])

2
var vars = {};
var var_name = "str";
vars[var_name] = "working";
console.log(vars["str"]);

0

Bạn có thể sử dụng JavaScript eval(str) hàm .

Những gì hàm này làm là chuyển đổi chuỗi được cung cấp thành mã JS, sau đó thực thi nó.

Ví dụ:

eval("console.log('hello world')"); // Logs hello world

Vì vậy, để sử dụng nó như một biến biến, bạn có thể làm như sau:

var a = "hello";
var hello = "world";
console.log(a + " " + eval(a)); // Logs hello world

Điều này sẽ tạo ra đầu ra chính xác giống như:

console.log(a + " " + hello); // Logs hello world

(Ví dụ được lấy từ hướng dẫn sử dụng PHP về các biến biến .)

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.