JavaScript - không thể đặt thuộc tính không xác định


108

Mã của tôi:

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 'lời chào' của không xác định.

Tôi đang cố gắng làm điều 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?


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

Câu trả lời:


159

bạn không bao giờ đặt d[a]thành 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 trên 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 trình 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 dtrong một phiên bản hàm ẩn danh:

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

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

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

Điều này có hiệu quả. mẫu phải là: d = {[a]: {
welcome

@robertjewell, điểm tốt, tôi đã cập nhật để bao gồm ghi chú về ký hiệu ES2015.
zzzzBov

Lời giải thích đáng kinh ngạc.
fiza khan

32

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

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

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

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


arrayhoặc object. JS không có mảng kết hợp, mặc dù Objectcó thể hoạt động giống như một mảng cho các mục đích sử 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 cấp độ suy nghĩ đó, JavaScript không có mảng; nó chỉ có đối tượng
vol7ron

Không chính xác. Có một số khía cạnh của mảng kết hợp không đúng về các đối tượng Javacript có thể làm tăng mã. (Mảng liên kết thực sự không bị giới hạn bởi việc yêu cầu các khóa là chuỗi. Sự hiện diện của các thuộc tính được xác định trước được kế thừa là một khác biệt lớn.) Mặt khác, mảng Javascript, trong khi các đối tượng, hoạt động giống như người ta mong đợi một mảng số hoạt động. Một là một khía cạnh của chức năng, trong khi cái kia là triển khai nội bộ.
Jeremy J Starcher

6

Đối tượng được lưu trữ tại d[a]chưa được đặt thành bất kỳ thứ gì. Do đó, d[a]đánh giá undefined. Bạn không thể gán 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);

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

5

Trong javascript hầu hết mọi thứ đều là một đối tượng nullundefinedngoại lệ.

Thể hiện của Arraylà một đối tượng. vì vậy bạn có thể đặt thuộc tính của một mảng, vì lý do tương tự, bạn không thể đặt thuộc tính của một mảng không xác định, vì nó KHÔNG phải là một đối tượng


3

tôi chỉ thực hiện một kiểm tra đơn giản để xem liệu d [a] có tồn tại hay không 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);
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.