문제

다음은 두 개의 배열 (NP 및 OP)이있는 코드입니다. 하나는 다른 하나의 사본입니다.

그러나 사본을 수정하면 원본도 수정됩니다! 구경하다:

<script type="text/javascript">
var op=new Array(0, 0);
var np=op;
np[1]=2;
document.write(op+"<br>")
document.write(np)
</script>

원본을 유지하고 사본을 수정하는 방법이 있습니까?

도움이 되었습니까?

해결책

당신은 배열 사본을 만들지 않았습니다. 배열을 다른 변수에 할당했습니다. JavaScript로 복사되지 않습니다. 예에서는 액세스 할 수있는 두 개의 변수가있는 하나의 배열 만 있습니다. JavaScript로 배열을 복사하는 내장 방법이 없으므로 자신의 기능을 작성해야합니다.

보세요 이 stackoverflow 질문 배열에서 요소를 실제로 복사하는 방법에 대한 힌트.

다른 팁

내장 된 배열 함수 중 일부는 실제로 귀하를 위해 사본을 생성합니다. 그 중 하나는 슬라이스입니다.

예를 들어:

var op=new Array(0, 0);
var np= op.slice(0);
np[1]=2;
document.write(op+"<br>")
document.write(np)

참조 http://my.opera.com/greywyvern/blog/show.dml/1725165

당신이하는 일은 배열의 사본을 만드는 것이 아니라 배열에 대한 참조 사본 만 생성되므로 동일한 배열 개체에 대한 두 개의 참조를 얻을 수 있습니다.

이것이 배열의 실제 사본을 만들 수있는 방법입니다.

var np = op.concat();

그만큼 concat 메소드 추가 항목이 추가 된 배열 사본 인 새 배열을 만듭니다. 추가 항목을 지정하지 않으면 배열 사본 만 얻습니다.

Array.prototype.copy = function() {
    return this.slice(0, this.length);
  }

그 다음에


var op=new Array(0, 0);
var np=op.copy();
np[1]=2;
document.write(op+"<br>")
document.write(np)

복사하는 대신 두 번째 배열을 복제해야합니다.

--- 업데이트

객체를 변수에 할당하면 참조 만 복사됩니다 (즉, 동일한 데이터를 가리 킵니다). 이 개체의 독립적 인 사본을 사용하려면 복제해야합니다. 예를 들어이 방법에는 몇 가지 방법이 있습니다. 여기 jQuery를 사용하여 물체를 복제하는 방법입니다.

원본을 사용할 수 있습니다 slice 배열 사본을 반환하는 메소드 :

var np = op.slice(0,op.length);

두 번째 매개 변수는 선택 사항이어야하지만 즉, 필요하다고 생각합니다.

변경 사항으로 완료 한 코드 :

var op=new Array(0, 0);
var np=op.slice(0,op.length);
np[1]=2;
document.write(op+"<br>")
document.write(np)

새 배열을 만들려면 다음을 고려할 수 있습니다.

   var op = [];

배열을 복사하려면 :

var np=op.slice();

또는

var np=op.concat();

Slice는 하나의 캐릭터가 적은 반면 Concat는 더 빠릅니다. 어떤 사람들은 "슬라이스"또는 "concat"을 "복사"로 "사본"으로 만들기 위해 더 분명합니다.

두 경우 모두 매개 변수가 필요하지 않습니다. 슬라이스의 매개 변수는 코드를 더 크고 느리게 만듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top