JavaScript - tidak dapat menyetel properti yang tidak ditentukan

108

Kode saya:

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

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

console.debug (d);

Saya mendapatkan kesalahan berikut:

TypeError Tak Tertangkap: Tak dapat menyetel properti 'salam' dari tak terdefinisi.

Saya mencoba melakukan sesuatu yang mirip dengan array asosiatif. Mengapa ini tidak berhasil?

StackOverflowNewbie
sumber
1
d [a] tidak ditentukan. Intinya d ["1"] tidak ditentukan
Joseph Marikle

Jawaban:

159

Anda tidak pernah menetapkan d[a]nilai apa pun.

Karenanya, d[a]evaluasi ke undefined, dan Anda tidak dapat mengaktifkan properti undefined.

Jika Anda menambahkan d[a] = {}tepat setelah d = {}hal-hal harus berfungsi seperti yang diharapkan.

Alternatifnya, Anda bisa menggunakan penginisialisasi objek:

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

Atau Anda dapat mengatur semua properti ddalam contoh fungsi anonim:

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

Jika Anda berada di lingkungan yang mendukung fitur ES2015, Anda bisa menggunakan nama properti yang dihitung :

d = {
  [a]: {
    greetings: b,
    data: c
  }
};
zzzzBov
sumber
Ini berhasil. polanya harus: d = {[a]: {salam: b, data: c}}
robskrob
@robertjewell, bagus, saya telah memperbarui untuk menyertakan catatan tentang notasi ES2015.
zzzzBov
Penjelasan yang luar biasa.
fiza khan
32

Anda harus menyetel d[a]ke array asosiatif, atau objek:

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

Tanpa pengaturan, inilah yang terjadi:

d[a] == undefined, jadi yang Anda lakukan undefined['greeting']=b;dan menurut definisi, undefined tidak memiliki properti. Jadi, kesalahan yang Anda terima.

vol7ron
sumber
arrayatau object. JS tidak memiliki array asosiatif, meskipun Objectdapat bertindak seperti array untuk penggunaan terbatas.
Jeremy J Starcher
@JeremyJStarcher: benar-benar benar dan penting untuk diketahui, tetapi dengan tingkat pemikiran seperti itu, JavaScript tidak memiliki array; itu hanya memiliki objek
vol7ron
Tidak persis. Ada aspek array asosiatif yang tidak benar tentang objek Javacript yang dapat membuat pembuat kode tersandung. (Larik asosiasi sejati tidak dibatasi dengan mengharuskan kunci menjadi string. Kehadiran properti bawaan yang telah ditentukan adalah perbedaan besar lainnya.) Di sisi lain, larik Javascript, sementara objek, bertindak seperti seseorang mengharapkan larik numerik berperilaku. Salah satunya adalah aspek fungsionalitas, sedangkan yang lainnya adalah implementasi internal.
Jeremy J Starcher
6

Objek yang disimpan di d[a]belum disetel ke apa pun. Jadi, d[a]evaluasi ke undefined. Anda tidak dapat menetapkan properti ke undefined:). Anda perlu menetapkan objek atau larik ke d[a]:

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

console.debug(d);
Polaris878
sumber
2
Terbaik untuk menetapkan objek: d[a] = {};- menggunakan array dengan kunci non-numerik cenderung menyebabkan masalah di kemudian hari.
nnnnnn
5

Dalam javascript hampir semuanya adalah objek, nulldan undefinedada pengecualian.

Contoh dari Arrayadalah sebuah objek. sehingga Anda dapat mengatur properti dari sebuah array, untuk alasan yang sama, Anda tidak dapat mengatur properti dari yang tidak ditentukan, karena BUKAN sebuah objek

wukong
sumber
3

saya hanya akan melakukan pemeriksaan sederhana untuk melihat apakah d [a] ada dan jika tidak menginisialisasinya ...

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);
iohzrd
sumber