JavaScript-정의되지 않은 속성을 설정할 수 없습니다.


108

내 코드 :

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

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

console.debug (d);

다음과 같은 오류가 발생합니다.

Uncaught TypeError : 정의되지 않은 'greeting'속성을 설정할 수 없습니다.

연관 배열과 비슷한 것을 시도하고 있습니다. 왜 이것이 작동하지 않습니까?


1
d [a]는 정의되지 않았습니다. 본질적으로 d [ "1"]는 정의되지 않았습니다
Joseph Marikle 2011-09-20

답변:


159

d[a]어떤 값도 설정하지 않았습니다.

이 때문에는로 d[a]평가되며 undefined에서 속성을 설정할 수 없습니다 undefined.

d[a] = {}바로 추가하면 d = {}예상대로 작동합니다.

또는 객체 이니셜 라이저를 사용할 수 있습니다.

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, 데이터 : 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 객체에 대해 사실이 아닌 연관 배열의 측면이 있습니다. (진정한 연관 배열은 키를 문자열로 요구함으로써 제한되지 않습니다. 상속 된 사전 정의 된 속성의 존재는 또 다른 주요 차이점입니다.) 반면에 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

자바 스크립트에서 거의 모든 객체이며, nullundefined예외입니다.

의 인스턴스 Array는 개체입니다. 정의되지 않은, 때문에의이 같은 이유로, 배열의 속성을 설정할 수 있도록, 당신이 할 수없는 일련의 특성 NOT 객체


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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.