2014-12-19 3 views
2

이 간단한 스크립트에서 a.person에 포함 된 문자열의 값을 변경하려고합니다. object.property의 값을 업데이트하지 않는 이유는 무엇입니까? 개체를 동적으로 업데이트하려면 어떻게해야합니까?

function searchObject(object, value) { 
 

 
    object = value; 
 

 
} 
 

 
var a = { 
 
    person: "Ian" 
 
}; 
 

 
searchObject(a.person, "James"); 
 

 
document.write(a.person);

나는 출력이 "제임스"이 아닌 "이안"인 것을 생각했다. 왜 내 개체를 업데이트하지 않습니까?

+2

이 함수는 문자열이 아니라 객체가 아닙니다. 어쨌든 부모 객체에 대한 참조를 얻는 방법은 무엇입니까? – Sirko

답변

6

는 당신이 지금하고있는 것은 값 value와 지역 변수 object을 대체하고있다. 당신이이를 대신 할 수있는 것은 :

function searchObject(object, property, value) { 
 
    object[property] = value; 
 
} 
 

 
var a = { 
 
    person: "Ian" 
 
}; 
 

 
searchObject(a, 'person', "James"); 
 

 
document.write(a.person);

그런 다음 로컬 변수 만 개체의 속성을 대체되지 않습니다. 객체는 여전히 동일한 것을 참조하며이 코드에서는 객체를 로컬로 바꾸는 대신 객체를 편집하고 있습니다.

JavaScript에서는 모든 함수 인수가 값에 의해 전달되기 때문에 개체는 값으로 전달되지 않기 때문에 포인터가 아닌 값으로 저장되므로 a을 입력하면 개체의 메모리 주소 만 제공됩니다. 함수 매개 변수 그런 다음 함수 내에서 해당 변수에 다시 액세스하면 동일한 것의 포인터가됩니다. 속성을 변경하면 실제 개체의 속성도 변경됩니다.

+1

와우. 우리는 같은 시간에 문자 그대로 같은 대답을 게시했습니다 .-D –

+1

예 : P, 당신은 7 초 동안 나를 싫어했습니다. – Joeytje50

+1

답은 정확 합니다만,'object [property] = value'는 작업을 완료하기위한 매우 간결한 구문입니다. 함수로 감쌀 필요는 없습니다. – rojobuffalo

4

이것은 참조로 전달 된 객체이기 때문입니다. 다른 모든 것은 가치에 의해 전달됩니다. 당신이 직장이를 원한다면, 당신이 시도 할 수 :

function searchObject(object, key, value) { 
 
    object[key] = value; 
 
} 
 

 
var a = { 
 
    person: "Ian" 
 
}; 
 

 
searchObject(a, "person", "James"); 
 

 
document.write(a.person);

2

a.person을 개체로 전달하지만 a.person은 문자열 값입니다. 문자열은 참조가 아닌 JavaScript에서 값으로 전달됩니다. 즉, 함수의 object은 기본적으로 "Ian" 문자열의 복사본이며 실제 값은 a.person이 아닙니다.

+1

이것은 대부분 사실이지만 완전히 아닙니다. JS의 모든 내용은 참조로 전달되지만 JS에서는 객체가 * 포인터 *이고 문자열과 정수는 그렇지 않습니다. 'a.person'이 배열이라 할지라도, 함수에서'object = value'를하는 것은 여전히 ​​작동하지 않을 것입니다. – Joeytje50

+0

매우 사실입니다. 나는 "본질적으로"사본을 가지고 그것을 얻으려고 노력하고 있었지만, 아마 추가적으로 명확성이 필요했을 것이다. – musicfuel

관련 문제