JavaScript - tanımsız özelliği ayarlanamaz


108

Kodum:

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

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

console.debug (d);

Şu hatayı alıyorum:

Yakalanmamış TypeError: Tanımsız 'selamlama' özelliği ayarlanamaz.

İlişkilendirilebilir bir diziye benzer bir şey yapmaya çalışıyorum. Bu neden çalışmıyor?


1
d [a] tanımsızdır. Özünde d ["1"] tanımsızdır
Joseph Marikle

Yanıtlar:


159

asla d[a]herhangi bir değere ayarlamazsınız .

Bu nedenle, olarak d[a]değerlendirilir undefinedve özellikleri ayarlayamazsınız undefined.

d[a] = {}Hemen sonra eklerseniz d = {}, işler beklendiği gibi çalışmalıdır.

Alternatif olarak, bir nesne başlatıcı kullanabilirsiniz:

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

Veya danonim bir işlev örneğindeki tüm özelliklerini ayarlayabilirsiniz :

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

ES2015 özelliklerini destekleyen bir ortamdaysanız, hesaplanmış özellik adlarını kullanabilirsiniz :

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

Bu işe yarıyor. kalıp şöyle olmalıdır: d = {[a]: {selamlar: b, veri: c}}
robskrob

@robertjewell, iyi nokta, ES2015 gösterimi ile ilgili notu dahil etmek için güncelledim.
zzzzBov

İnanılmaz açıklama.
fiza khan

32

d[a]İlişkili bir dizi veya bir nesneye ayarlamanız gerekir:

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

Ayar yapmadan, olan şey şu:

d[a] == undefined, yani siz yapıyorsunuz undefined['greeting']=b;ve tanım gereği undefined'ın hiçbir özelliği yok. Böylece aldığınız hata.


arrayveya object. JS'nin ilişkilendirilebilir dizileri yoktur, ancak Objectsınırlı kullanımlar için bir dizi gibi hareket edebilir.
Jeremy J Starcher

@JeremyJStarcher: kesinlikle doğru ve bilinmesi önemli, ancak bu düşünce düzeyine göre, JavaScript'in dizileri yoktur; sadece nesnesine sahip olan
vol7ron

Tam olarak değil. İlişkilendirilebilir dizilerin kodlayıcıları tetikleyebilen Javacript nesneleri hakkında doğru olmayan yönleri vardır. (Gerçek ilişkilendirilmiş diziler, anahtarların dizge olmasını zorunlu kılarak sınırlandırılmaz. Devralınan önceden tanımlanmış özelliklerin varlığı bir başka önemli farktır.) Diğer yandan, nesneler, sayısal bir dizinin davranmasını beklediği gibi davranırken, Javascript dizileri. Biri işlevselliğin bir yönü, diğeri ise dahili uygulama.
Jeremy J Starcher

6

Adresinde depolanan nesne d[a]hiçbir şeye ayarlanmadı. Böylece d[a]değerlendirir undefined. undefined:) öğesine bir özellik atayamazsınız . Aşağıdakilere bir nesne veya dizi atamanız gerekir d[a]:

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

console.debug(d);

2
Bir nesneyi atamak için en iyisi: d[a] = {};- sayısal olmayan tuşlara sahip dizileri kullanmak, aşağı doğru sorunlara yol açma eğilimindedir.
nnnnnn

5

JavaScript'te neredeyse her şey bir nesnedir nullve undefinedistisnadır.

Örnekleri Arraybir nesnedir. böylece bir dizinin özelliğini ayarlayabilirsiniz, aynı nedenle, tanımsız bir nesnenin özelliğini ayarlayamazsınız çünkü bu bir nesne DEĞİLDİR


3

d [a] nın olup olmadığını görmek için basit bir kontrol yapardım ve eğer onu başlatmazsam ...

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.