2013-07-26 2 views
8

나는 호기심에 의문을 가지고있다. JS가 변수 할당을 처리하는 방법을 살펴 보았습니다. How does variable assignment work in JavaScript?자바 스크립트 변수로서 객체 포인터

그러나 같은 원칙은 내가 일하고 다음 코드 자체를 전시하지 않는 것은 :

var temp = playlist1[0]; 
playlist1[0] = playlist1[1]; 
playlist1[1] = temp; 

나는이 배열 요소를 교환하기위한 표준 방법입니다 알고있다. 하지만 temp가 playlist1[0]을 가리키고 playlist1[0]의 내용이 playlist1[1]으로 변경되면 어떻게 두 개의 playlist1[1] 값이 연속적으로 끝나지 않습니까?

+0

[JavaScript에서 변수 할당은 어떻게 작동합니까?] (http : // stackoverflow?com/questions/509579/how-does-variable-assign-work-in-javascript) –

+0

링크 된 질문의 대답이 귀하의 질문에 대한 답변이기 때문에 이것을 중복으로 표결했습니다. –

+0

@EvanTrimboli 나는 기존 질문에 대한 더 명확한 설명을 요구하기 때문에 질문은 공정하다고 생각합니다. 다른 질문은 오래되었고 아마 더 이상 감시되지 않습니다. – TGH

답변

11

변수은 개체 포인터입니다. 모든 값 (프리미티브가 아님)은 객체 포인터입니다. 따라서 temp은 객체 포인터입니다. playlist1은 요소가 객체 포인터 인 배열 객체에 대한 객체 포인터입니다. 예 : playlist1[0] 객체의 포인터, playlist1[1]는 객체 포인터 등

이다 그러나 온도가 playlist1 가리키는 경우 [0]

이 이해가되지 않습니다. temp은 개체 포인터입니다. 그것은 객체를 가리 킵니다. playlist1[0]은 개체가 아닙니다. 그것은 객체 포인터입니다. temp = playlist1[0];은 오브젝트 포인터 temp이 오브젝트 포인터 playlist1[0]과 같은 오브젝트를 가리 키도록합니다. 당신이 C를 알고 있다면

,이 같은 동일합니다 :

Object *playlist1[10]; 

Object *temp = playlist1[0]; 
playlist1[0] = playlist1[1]; 
playlist1[1] = temp; 
+1

OP의 테이크 어웨이 : 배열 요소는 객체가 아니며 객체의 포인터이기도합니다. 이것은 나의 질문에 대답하고 메커니즘에 대한 나의 이해를 깊게했다. – nemo

2

이것은 참조 된 질문의 대답과 일치합니다. 포인터는 이전에 가리킨 데이터가 아닌 변수가 가리키는 개체를 변경하는 것입니다. 의미 temp는 playlist1 [1]이 playlist1 [2]를 가리키는 이동에 영향을받지 않습니다. Temp는 playlis1 [1]과 temp가 둘 다 가리킬 때 가리키는 원래 값을 유지합니다. playlist1 [1] 만 업데이트됩니다.

0

이들은 여전히 ​​요소 자체가 아니라 배열의 요소에 대한 참조이기 때문입니다. 그래서 줄에 :

playlist[1]=playlist[2] 

임시에 대해서는 아무 것도 변하지 않습니다. 같은과 (가정 배열 요소 오브젝트했다) 것을 대비 : 실제로 배열 객체의 값을 할당하고,

playlist[1].x=playlist[2].x 

온도 [1] 다음 temp.x는 것 같 재생 목록을 재생 목록에 지적한다면 [2] .x

0

우리가 obj={l1:{l2:[1,2]},}이 있다고 우리는 arr=["l1","l2",1] 같은 수준의 배열을 사용하여 obj.l1.l2[1]를 해결하려면 :

Object.defineProperty(Object.prototype,'point',{ 
    value:function(arr){ 
     var rez=this; 
     for(var s in arr){ 
      rez=rez[arr[s]]; 
      if(rez === undefined) return undefined; 
     } 
     return rez; 
    } 
}); 

그래서 우리가 사용할 수있는 "포인트"방법 (에리스로 팅을 망칠 수 없다)을 정의한 후에

obj.point(arr) 

값을 얻으려면 2