Câu hỏi JavaScript - không thể đặt thuộc tính không xác định


Ma cua toi:

    var a = "1",
        b = "hello",
        c = { "100" : "some important data" },
        d = {};

        d[a]["greeting"] = b;
        d[a]["data"] = c;

        console.debug (d);

Tôi nhận được lỗi sau đây:

Uncaught TypeError: Không thể đặt thuộc tính 'greeting' của undefined.

Tôi đang cố gắng làm một cái gì đó tương tự như một mảng kết hợp. Tại sao điều này không hoạt động?


76
2017-09-20 02:44


gốc


d [a] không xác định. Về bản chất d ["1"] không xác định - Joseph Marikle


Các câu trả lời:


bạn chưa bao giờ đặt d[a] cho bất kỳ giá trị nào.

Bởi vì điều này, d[a] đánh giá undefinedvà bạn không thể đặt thuộc tính undefined.

Nếu bạn thêm d[a] = {} ngay sau khi d = {} mọi thứ sẽ hoạt động như mong đợi.

Ngoài ra, bạn có thể sử dụng bộ khởi tạo đối tượng:

d[a] = {
    greetings: b,
    data: c
};

Hoặc bạn có thể đặt tất cả các thuộc tính của d trong một cá thể hàm ẩn danh:

d = new function () {
    this[a] = {
        greetings: b,
        data: c
    };
};

Nếu bạn đang ở trong một môi trường hỗ trợ các tính năng ES2015, bạn có thể sử dụng tên thuộc tính được tính toán:

d = {
  [a]: {
    greetings: b,
    data: c
  }
};

108
2017-09-20 02:45



Điều này không hoạt động. mẫu phải là: d = {[a]: {lời chào: b, dữ liệu: c}} - robskrob
@robertjewell, điểm tốt, tôi đã cập nhật để bao gồm các lưu ý về ký hiệu ES2015. - zzzzBov


Bạn phải đặt d[a] cho một mảng kết hợp hoặc một đối tượng:

  • d[a] = [];
  • d[a] = {};

Không có thiết lập, đây là những gì đang xảy ra:

d[a] == undefined, bạn đang làm undefined['greeting']=b; và theo định nghĩa, undefined không có thuộc tính. Vì vậy, lỗi bạn nhận được.


24
2017-09-20 02:51



array hoặc là object. JS không có mảng kết hợp, mặc dù Object có thể hoạt động như một ứng dụng hạn chế. - Jeremy J Starcher
@ JeremyJStarcher: hoàn toàn chính xác và quan trọng cần biết, nhưng theo mức độ suy nghĩ đó, JavaScript không có mảng; nó chỉ có đối tượng - vol7ron
Không chính xác. Có những khía cạnh của mảng kết hợp không đúng về các đối tượng Javacript có thể đi lên các lập trình viên. (Các mảng kết hợp thực sự không bị giới hạn bởi yêu cầu các khóa là các chuỗi. Sự hiện diện của các thuộc tính được xác định trước được thừa kế là một khác biệt lớn.) Mặt khác, các mảng Javascript, trong khi các đối tượng, hành động giống như một mảng số để hành xử. Một là một khía cạnh của chức năng, trong khi bên kia là thực hiện nội bộ. - Jeremy J Starcher


Đối tượng được lưu trữ tại d[a] chưa được đặt thành bất kỳ thứ gì. Như vậy, d[a] đánh giá undefined. Bạn không thể chỉ định thuộc tính cho undefined :). Bạn cần gán một đối tượng hoặc mảng cho d[a]:

d[a] = [];
d[a]["greeting"] = b;

console.debug(d);

5
2017-09-20 02:47



Tốt nhất để chỉ định một đối tượng: d[a] = {}; - sử dụng các mảng với các phím không phải là số có xu hướng dẫn đến các sự cố trong dòng. - nnnnnn


Trong javascript gần như mọi thứ đều là một đối tượng, null và undefined là ngoại lệ.

Trường hợp của Array là một đối tượng. vì vậy bạn có thể thiết lập thuộc tính của một mảng, vì lý do tương tự, bạn không thể thiết lập thuộc tính của một undefined, bởi vì nó KHÔNG PHẢI một đối tượng


4
2017-09-20 03:40





tôi chỉ cần làm một kiểm tra đơn giản để xem nếu d [a] tồn tại và nếu không khởi tạo nó ...

var a = "1",
    b = "hello",
    c = { "100" : "some important data" },
    d = {};

    if (d[a] === undefined) {
        d[a] = {}
    };
    d[a]["greeting"] = b;
    d[a]["data"] = c;

    console.debug (d);

0
2018-03-31 21:19