배열 객체 복사와 관련해 질문이 있습니다.
조회수 860회
본 질문은 수강생의 질문을 해쉬코드로 옮긴 것입니다.
.
안녕하세요. 선생님~
질문이 있습니다.
.
function copyArray(array) {
for ( var copy=[], i=0, l=array.length; i<l; ++i ) {
copy[i] = array[i];
}
return copy;
}
var a = copyArray([3,6,9]);
var yu = [3,6,9,12];
var a = copyArray(yu);
.
에서 yu == a
도 yu === a
처럼 false
가 나옵니다.
yu == a
는 true
일 거라고 예상했습니다.
그래서 yu[1] == a[1]
를 찍어보니 true
입니다.
왜 yu == a
도 false
일까요?
-
(•́ ✖ •̀)
알 수 없는 사용자
2 답변
-
안녕하세요 ^ ㅡ ^
질문에 답변 드립니다.
먼저 코드를 통해 "참조"를 정리해봅시다.
.
// 변수 a,b,c 정의 var a, b, c; // 변수에 동일한 객체 참조 a = b = c = [3, 8, 12]; // 각 변수가 동일한 객체를 참조하는 지 검증 console.log(a == b); // true console.log(b === c); // true // b 변수를 통해 객체를 변형 b.shift(); // [8, 12] // 각 변수가 동일한 객체를 참조하는 지 검증 console.log(a == b); // true console.log(b === c); // true
.
각 변수가 참조하는 객체는 동일한 객체 라는 사실을 검증했습니다.
그럼 이제는 질문을 살펴보고 이유를 알아봅시다. ^ ㅡ ^
역시 코드를 먼저 본 후 이야기를 해보겠습니다.
.
// a변수에 배열 참조 var a = [ 10, false, [1] ]; // b 변수에 a 변수가 참조하는 배열 객체를 복사한 후 할당 var b = copyArray(a); // [ 10, false, [1] ] // a, b 변수는 동일해보이지만, 동일한 객체를 참조하지 않음 // 이유는 객체는 복사가 되면 더 이상 같은 객체가 아니기 때문 console.log(a == b); // false console.log(a === b); // false
.
이 부분이 핵심입니다. 참조는 동일한 객체를 다수의 변수가 공유하지만, 복사된 객체는 더 이상 객체를 공유하지 않습니다. 즉, 복사된 객체는 동일해보여도 전혀 다른 객체입니다.
자 그럼 코드를 적용해 결과를 봅시다.
.
var yu = [3,6,9,12]; var a = copyArray(yu); // [3,6,9,12] console.log(yu == a); // false console.log(yu === a); // false
.
위에서 살펴본 코드 결과와 마찬가지로
객체는 복사가 되면 동일한 객체처럼 보이나,
동일한 객체가 아니라는 사실입니다.
.
이제 이유를 아시겠죠?
왜
yu == a
가false
인지 말이죠.그리고
a[1] == yu[1]
이 같은 이유는배열 복사 과정에서 원시 값은 값 복사 되었기 때문에
데이터 값이 같다고 나오는 겁니다. ^ - ^
-
(•́ ✖ •̀)
알 수 없는 사용자
-
-
선생님, 제가 이해한 것이 맞는지 한 번 더 여쭤봅니다~
-- yu, a 에 들어간 값은 같지만, 복사된 객체라 참조 위치가 다르기 때문에 ==, === 이 false라는 결과가 나옴
-- 그러면 결론적으로 객체에 ==, === 연산자를 사용할 때, 원시타입과는 다르게 객체가 저장된 위치(?) 도 함께 비교되는 것으로 이해하면 될까요? ^
-
(•́ ✖ •̀)
알 수 없는 사용자
- 복사된 객체는 전혀 다른 객체로 메모리 상에 기억되는 위치가 다릅니다. 말씀하신 것처럼 참조 위치가 다른 거죠. ^^ 그리고 원시 타입은 상수 값으로 값 그 자체에 대한 비교 입니다. 비교 시 === 연산자는 타입을 변형 시키지 않는 반면, == 는 자동으로 타입을 변형 시켜 비교하기 때문에 == 는 사용하지 않는 것이 좋습니다. 마지막으로 객체가 참조하는 메모리 상의 주소가 다르면 같은 데이터가 아니므로 == 와 === 결과는 동일합니다. 알 수 없는 사용자 2018.9.6 00:27
- 언제나 친절하게 궁금증을 해소해 주셔서 감사합니다~ 알 수 없는 사용자 2018.9.6 06:43
- 언제나 친절하게 궁금증을 해소해 주셔서 감사합니다~ 알 수 없는 사용자 2018.9.6 06:43
- 언제나 친절하게 궁금증을 해소해 주셔서 감사합니다~ 알 수 없는 사용자 2018.9.6 06:43
-
댓글 입력