JavaScript - ไม่สามารถตั้งค่าคุณสมบัติของ undefined


111

รหัสของฉัน:

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

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

console.debug (d);

ฉันได้รับข้อผิดพลาดต่อไปนี้:

Uncaught TypeError: ไม่สามารถตั้งค่าคุณสมบัติ 'คำทักทาย' ของ undefined

ฉันกำลังพยายามทำสิ่งที่คล้ายกับอาร์เรย์เชื่อมโยง เหตุใดจึงไม่ทำงาน


1
d [a] ไม่ได้กำหนดไว้ ในสาระสำคัญ d ["1"] ไม่ได้กำหนดไว้
Joseph Marikle

คำตอบ:


161

คุณไม่เคยตั้งค่าd[a]เป็นค่าใด ๆ

ด้วยเหตุนี้จึงd[a]ประเมินเป็นundefinedและคุณไม่สามารถตั้งค่าคุณสมบัติundefinedได้

หากคุณเพิ่มd[a] = {}ทันทีd = {}สิ่งต่างๆควรเป็นไปตามที่คาดไว้

หรือคุณสามารถใช้ object initializer:

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

หรือคุณสามารถตั้งค่าคุณสมบัติทั้งหมดของdอินสแตนซ์ฟังก์ชันที่ไม่ระบุชื่อ:

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

หากคุณอยู่ในสภาพแวดล้อมที่รองรับคุณสมบัติ ES2015 คุณสามารถใช้ชื่อคุณสมบัติที่คำนวณได้ :

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

สิ่งนี้ได้ผล รูปแบบควรเป็น: d = {[a]: {คำทักทาย: b, data: c}}
robskrob

@robertjewell จุดดีฉันได้อัปเดตเพื่อรวมบันทึกเกี่ยวกับสัญกรณ์ ES2015
zzzzBov

คำอธิบายที่น่าทึ่ง
fiza khan

32

คุณต้องตั้งค่าd[a]เป็นอาร์เรย์เชื่อมโยงหรือวัตถุ:

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

หากไม่มีการตั้งค่านี่คือสิ่งที่เกิดขึ้น:

d[a] == undefinedดังนั้นคุณกำลังทำอยู่undefined['greeting']=b;และตามคำนิยาม undefined ไม่มีคุณสมบัติ ดังนั้นข้อผิดพลาดที่คุณได้รับ


arrayหรือobject. JS ไม่มีอาร์เรย์ที่เชื่อมโยงกัน แต่Objectสามารถทำหน้าที่เหมือนอาร์เรย์ สำหรับการใช้งานที่ จำกัด
Jeremy J Starcher

@JeremyJStarcher: ถูกต้องและสำคัญอย่างยิ่งที่ต้องรู้ แต่ด้วยความคิดระดับนั้น JavaScript ไม่มีอาร์เรย์ มันมี แต่วัตถุ
vol7ron

ไม่ตรง มีแง่มุมของอาร์เรย์ที่เชื่อมโยงซึ่งไม่เป็นความจริงเกี่ยวกับวัตถุ Javacript ที่สามารถเดินทางไปถึง coders ได้ (อาร์เรย์เชื่อมโยงที่แท้จริงไม่ได้ [t จำกัด โดยกำหนดให้คีย์เป็นสตริงการมีอยู่ของคุณสมบัติที่กำหนดไว้ล่วงหน้าที่สืบทอดมานั้นเป็นความแตกต่างที่สำคัญอีกประการหนึ่ง) ในทางกลับกันอาร์เรย์ Javascript ในขณะที่อ็อบเจ็กต์ทำหน้าที่เหมือนหนึ่งคาดว่าอาร์เรย์ตัวเลขจะทำงาน หนึ่งคือด้านของฟังก์ชันการทำงานในขณะที่อีกด้านเป็นการใช้งานภายใน
Jeremy J Starcher

6

วัตถุที่เก็บไว้ที่d[a]ไม่ได้ถูกตั้งค่าเป็นอะไรเลย ดังนั้นประเมินd[a] undefinedคุณไม่สามารถกำหนดคุณสมบัติให้undefined:) คุณต้องกำหนดวัตถุหรืออาร์เรย์ให้กับd[a]:

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

console.debug(d);

2
ดีที่สุดในการกำหนดวัตถุ: d[a] = {};- การใช้อาร์เรย์ที่มีคีย์ที่ไม่ใช่ตัวเลขมีแนวโน้มที่จะนำไปสู่ปัญหาในบรรทัด
nnnnnn

5

ในจาวาสคริปต์เกือบทุกอย่างเป็นวัตถุnullและundefinedมีข้อยกเว้น

อินสแตนซ์ของArrayเป็นวัตถุ ดังนั้นคุณจึงสามารถตั้งค่าคุณสมบัติของอาร์เรย์ด้วยเหตุผลเดียวกันคุณไม่สามารถตั้งค่าคุณสมบัติของสิ่งที่ไม่ได้กำหนดได้เนื่องจากไม่ใช่วัตถุ


3

ฉันแค่ตรวจสอบง่ายๆเพื่อดูว่ามี d [a] อยู่หรือไม่และหากไม่ได้เริ่มต้น ...

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

d = {} เป็นวัตถุว่างเปล่าในขณะนี้

และ d [a] ยังเป็นวัตถุว่าง

ไม่มีค่าคีย์ใด ๆ ดังนั้นคุณควรเริ่มต้นค่าคีย์ของสิ่งนี้

d[a] = {
greetings:'',
data:''
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.