JavaScript에서 배열을 비우려면 어떻게합니까?


2197

배열을 비울 수있는 방법이 .remove()있습니까? 그렇다면 가능 합니까?

예를 들어

A = [1,2,3,4];

어떻게 비울 수 있습니까?


1
: 다른 가능성이있는 벤치 마크에 여기 jsben.ch/#/7QyI1
EscapeNetscape

답변:


4412

기존 배열을 지우는 방법 A:

방법 1

(이것은 질문에 대한 원래의 대답이었습니다)

A = [];

이 코드는 변수 A를 새로운 빈 배열로 설정합니다 . 이것은 실제로 새로운 배열을 생성하기 때문에 다른 곳 에서 원래 배열에 대한 참조A 가 없으면 완벽합니다 . 다른 변수 나 속성에서이 배열을 참조한 경우 원래 배열은 변경되지 않으므로이 방법에주의해야합니다. 원래 변수로만 배열을 참조하는 경우에만 사용하십시오A .

이것은 또한 가장 빠른 솔루션입니다.

이 코드 샘플은이 방법을 사용할 때 발생할 수있는 문제를 보여줍니다.

var arr1 = ['a','b','c','d','e','f'];
var arr2 = arr1;  // Reference arr1 by another variable 
arr1 = [];
console.log(arr2); // Output ['a','b','c','d','e','f']

방법 2 (같은 제안 에 의해 매튜 Crumley )

A.length = 0

길이를 0으로 설정하여 기존 배열을 지 웁니다. 일부는 이것이 모든 JavaScript 구현에서 작동하지 않을 수도 있다고 주장하지만, 그렇지 않은 것으로 밝혀졌습니다. 배열의 길이 속성은 읽기 / 쓰기 속성이므로 ECMAScript 5에서 "엄격 모드"를 사용할 때도 작동합니다.

방법 3 (같은 제안 에 의해 안토니 )

A.splice(0,A.length)

사용 .splice()은 완벽하게 작동하지만 .splice()함수는 제거 된 모든 항목이 포함 된 배열을 반환하므로 실제로 원래 배열의 복사본을 반환합니다. 벤치 마크에서는 이것이 성능에 영향을 미치지 않는다고 제안합니다.

방법 4 (같은 제안 에 의해 tanguy_k )

while(A.length > 0) {
    A.pop();
}

이 솔루션은 간결하지 않으며 원래 답변에서 참조 된 이전 벤치 마크와 달리 가장 느린 솔루션입니다.

공연

기존 배열 을 지우는 모든 방법 중에서 방법 2와 3은 성능면에서 매우 유사하며 방법 4보다 훨씬 빠릅니다 . 이 벤치 마크를 참조하십시오 .

아래 답변 에서 Diadistis 가 지적한 것처럼 위에서 설명한 네 가지 방법의 성능을 결정하는 데 사용 된 원래 벤치 마크에 결함이있었습니다. 원래 벤치 마크는 지워진 배열을 재사용하여 두 번째 반복에서 이미 비어있는 배열을 지 웁니다.

다음 벤치 마크 수정이 결함 : http://jsben.ch/#/hyj65 . 그것은 방법 # 2 (길이 속성)와 # 3 (접합)이 가장 빠르다는 것을 분명히 보여줍니다 (원래 배열을 변경하지 않는 방법 # 1을 세지 않음)


이것은 화제가되고 논란의 원인이되었습니다. 실제로 많은 정답이 있으며이 답변이 오랫동안 허용 된 답변으로 표시되어 있으므로 여기에 모든 방법을 포함하겠습니다. 이 답변에 투표하면 내가 언급 한 다른 답변도 찬성하십시오.


184
while (A.length) { A.pop(); }, 필요에> 0
이반 블랙

327
> 0더 읽기 쉬운 IMHO입니다. 그리고 둘 사이의 성능 차이는 없습니다.
Philippe Leybaert

10
@daghan, 당신이 말하려는 것이 전혀 명확하지 않습니다. 새 b배열 a이 할당 된 후에도 이전 배열에 대한 참조를 보유합니다 . cd동일한 배열을 계속 참조. 따라서 출력의 차이가 예상됩니다.
shovavnik

9
@DiegoJancic 메서드 # 1은 배열을 지우지 않기 때문에 계산되지 않습니다. 새로운 것을 만듭니다. 벤치 마크에 포함되지 않아야합니다.
Philippe Leybaert

44
while(A.pop())배열의 항목이 잘못된 경우 사용할 수 없습니다 . 예를 들어 A = [2, 1, 0, -1, -2]를 사용하면 A는 [2, 1]과 같습니다. 심지어 while(A.pop() !== undefined)값 중 하나로 정의되지 않은 당신은 배열을 가질 수 있기 때문에 작동하지 않습니다. 아마도 컴파일러가 최적화하지 않은 이유 일 것입니다.
Jonathan Gawrych

2458

업데이트해야 할 다른 참조가 있기 때문에 원래 배열을 유지해야하는 경우 길이를 0으로 설정하여 새 배열을 만들지 않고 지울 수 있습니다.

A.length = 0;

17
ECMAScript 5 Standard는 이에 대해 무엇을 말합니까?
Pacerier

212
@Pacerier : ES5에서도 여전히 작동합니다. 섹션 15.4에서 : "... 길이 속성이 변경 될 때마다, 이름이 새로운 길이보다 작은 배열 인덱스 인 모든 속성이 자동으로 삭제됩니다"
Matthew Crumley

2
@einar : JavaScript 배열은 항상 입력 한 내용에 맞게 확장되므로 호출 myarray.push(whatever)하면 길이에 1이 추가됩니다. 따라서 길이를 설정하면 배열이 잘리지 만 영구적이지는 않습니다.
Matthew Crumley

12
@LosManos 엄격 모드에서도 length특별한 속성이지만 읽기 전용이 아니므로 여전히 작동합니다.
Matthew Crumley

11
@MattewCrumley 몇 가지 테스트를 수행했으며 a.length = 0은 전체 배열을 효율적으로 지우지 않는 것 같습니다. jsperf.com/length-equal-0 또는 new-array 하나의 참조가 있고 유지하려는 추가 속성을 추가하지 않은 경우 새 배열을 만드는 것이 좋습니다. 적절한 경우 실행되는 가비지 수집기
Paul Brewczynski

289

동일한 배열유지 하면서 가장 빠르게 작동하는 구현 ( "변경 가능") :

function clearArray(array) {
  while (array.length) {
    array.pop();
  }
}

참고로 단순화 할 수 없습니다 while (array.pop()) 다음과 . 테스트가 실패합니다.

참고로 MapSet define clear(), Array에clear() 대해 논리적으로 보입니다. 도.

TypeScript 버전 :

function clearArray<T>(array: T[]) {
  while (array.length) {
    array.pop();
  }
}

해당 테스트 :

describe('clearArray()', () => {
  test('clear regular array', () => {
    const array = [1, 2, 3, 4, 5];
    clearArray(array);
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });

  test('clear array that contains undefined and null', () => {
    const array = [1, undefined, 3, null, 5];
    clearArray(array);
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });
});

업데이트 된 jsPerf : http://jsperf.com/array-destroy/32 http://jsperf.com/array-destroy/152


5
TT 귀하의 답변은 정확하고 빠른 (동시에) 유일무이 한 "공감대"가있는 유일한 답변입니다. 글쎄, 사람들은 느린 예쁜 솔루션을 좋아하는 것 같습니다 : /
obenjiro

@naomik 그러나 이것은 기본 기능 중 하나이며 기본적으로 있어야합니다.
thefourtheye

7
@thefourtheye @naomik에 동의하지만 성능에 좋은 솔루션이지만 기본 객체를 수정해서는 안됩니다. 요점 옆에 있어야한다고 말하면 문제는 전역 변수를 수정 하는 것입니다. 다른 사람이 사용할 수 있도록 코드를 제공하는 경우 예상치 못한 부작용이 없어야합니다. 다른 도서관이라면 을 수정 Array.prototype하고 약간 다른 일을 한 후 코드가 모든 전반에 걸쳐 [].clear()약간 틀렸다. 이것은 디버깅하기에 재미 있지 않습니다. 따라서 일반적인 메시지는 다음과 같습니다. 전역을 수정하지 마십시오.
jpillora

3
@thefourtheye 전역 범위를 수정하지 않는 요점은 다른 사람의 코드가 이미 이름을 사용 중인지 알 수 없기 때문 입니다. 로컬 범위 내에서 함수를 제안합니다. 따라서 응용 프로그램 / 라이브러리의 IIFE 내부 에서를 수행 function clear(arr) { while(arr.length) arr.pop(); }한 다음 clear(arr)대신 배열을 지우십시오 arr.clear().
jpillora

2
이 방법은 .splice()및 보다 훨씬 느립니다 .length=0. 벤치 마크가 올바르지 않습니다. 업데이트 된 답변을 참조하십시오.
필립 레이 바트

216

브라우저 간 친숙하고 최적의 솔루션은 다음과 같이이 방법을 사용 splice하여 배열 A의 내용을 비우는 것입니다.

A.splice(0, A.length);


49
브라우저 간 친근감이 더 좋은 이유는 무엇입니까? A.length에 어떤 브라우저 문제가 있습니까?
stricjux

4
@ jm2 당신이 말하는 것은 완전히 사실이 아닙니다. 실제로 해당 배열을 수정 한 다음 모든 참조가 영향을받습니다. 내 jsFiddle에서 테스트 참조 : jsfiddle.net/shamasis/dG4PH
Shamasis Bhattacharya

3
@alex 아니오 splice, 배열을 수정하고 삭제 된 항목을 반환합니다. 먼저 문서를 읽으십시오 : developer.mozilla.org/en-US/docs/JavaScript/Reference/…
David Hellsing

3
우리는 사용에 의해 반환되는 결과 배열을 방지 할 수 쉼표 연산자 : A.splice(0, A.length),0;. 이렇게하면 반환 값이 0그대로 유지됩니다 A.length = 0;. 결과 배열은 계속 생성 되므로 스크립트가 느리게 실행 되어야합니다 ( jsperf ~ 56 % 느림). 브라우저 구현이 splice설정보다 더 빠를 이유 가 보이지는 않지만 이것에 영향을 미칩니다 length.
Evan Kennedy

8
A.splice(0)또한 작동 한다는 것도 알았습니다 .
corwin.amber

97

지금까지 2739 개 이상의 찬성 투표가 오해의 소지가 있거나 잘못되었습니다.

문제는 "기존 배열을 어떻게 비우나요?"입니다. 예를 들어 A = [1,2,3,4].

  1. "말하기A = [] 답이다" 것은 무지하고 절대적으로 틀립니다. [] == []이다 거짓 .

    이것은이 두 배열이 두 개의 분리 된 개별 개체이기 때문에 두 개의 고유 한 ID를 가지며 각각 디지털 세계에서 고유 한 공간을 차지하기 때문입니다.


엄마가 쓰레기통을 비우라고한다고 가정 해 봅시다.

  • 요청한 것을 마치 마치 새로운 것을 가져 오지 않습니다.
  • 대신 휴지통을 비 웁니다.
  • 채워진 것을 새 빈 캔으로 교체하지 않고 채워진 캔에서 레이블 "A"를 가져 가지 않고 새 캔에 붙입니다. A = [1,2,3,4]; A = [];

배열 객체를 비우는 것이 가장 쉬운 방법입니다.

A.length = 0;

이런 식으로 "A"아래의 캔은 비어있을뿐만 아니라 새 것처럼 깨끗합니다!


  1. 또한 캔이 비워 질 때까지 손으로 쓰레기를 제거 할 필요가 없습니다! 다음과 같이 캔을 비울 때까지 기존 쓰레기통을 완전히 비워달라고 요청했습니다.

    while(A.length > 0) {
        A.pop();
    }
  2. 또한 왼손을 휴지통의 맨 아래에 놓고 맨 오른쪽을 잡고 다음과 같이 내용물을 꺼낼 수 있습니다.

    A.splice(0, A.length);

아니요, 비워 달라는 요청을 받았습니다.

A.length = 0;

이것은 주어진 JavaScript 배열의 내용을 올바르게 비우는 유일한 코드입니다.


11
제안 된 솔루션의 유일한 문제점은 휴지통이 여전히 존재한다는 것입니다. 휴지통이 없다는 알림 보드를 변경 한 것입니다. 이전 배열에 대한 참조는 여전히 존재해야합니다. .length = 0을 설정할 때 가비지 수집기가 배열과 해당 속성에 대한 모든 참조를 제거하는지 확인할 수 있습니까? 그래도 그렇게 생각하지만 그것은 저에게 마술입니다. 혼동을 피하기 위해 .clear () 메소드가 바람직합니다.
mmm

8
나는이 해결책이 잘못되었다고 결코 말하지 않았다. 문제는이 전체 스레드가 불필요하다는 것입니다. 3000 개 이상의 투표에서 EMCA 크랙 헤드 개발자가 이러한 방법을 추가 할 수있는 가장 좋은 방법을 찾아내는 것이 최선의 방법이라고 생각합니다. 아무도 알아낼 필요가 없습니다. 이를 수행하는 방법에는 3-4 가지가 있습니다. 일부 벤치 마크에서 길이 솔루션은 다른 솔루션보다 훨씬 느립니다. 또한 합리적인 개발자를 위해 .length = 0을 설정한다는 아이디어는 만족스럽지 않습니다.
mmm

2
필요한 것을 달성하기 위해서는 모든 참조를 제거해야합니다. .length = 0은 메소드 호출조차도 아니므로 0으로 설정했을 때 수행 된 다른 조치가있는 경우 (정의 setter를 통해 대부분의 브라우저에 있음) 실제로는 그것이 실제로 가정하는 것을 신뢰하기에는 너무 마술 적이라고 생각합니다 할 것.
mmm

7
따라서 나는 스스로 그것을 분명히하고 싶습니다. 명확한 방법으로 프로토 타입을 만들 수 있지만 그 방법은 추악합니다. 필자의 요점은이 구현이 이미 존재해야하므로 10,000 명 이상의 개발자가 더 많은 벤치마킹에 소비 한 다른 모든 사람을 고려하지 않고이 스레드 만 읽는 데 몇 시간을 소비하지 않아도된다는 것입니다.
mmm

1
배열을 비우는 새로운 방법은 새로운 수신 데이터로 채우고 다시 버리는 방법은 하나뿐입니다. 다른 모든 사람들은 엄청나게 비효율적이며 용감하게 CPU 배고프지 않습니다. 실질적인 대안은 A(n) = A.splice( 0, A.length );이전 컨텐츠를 백업해야하는 경우입니다. ps Array.length는 기본적인 사실을 놓친 경우를 대비하여 읽기-쓰기 속성입니다. 즉, 길이를 새로운 길이로 확장하고, 원하는 길이로 잘라낼 수 없으며, 특히 길이를 0으로 줄임으로써 모든 멤버를 버릴 수 있습니다. 이것은 배열의 스위스 나이프입니다.
Bekim Bacaj

63

성능 테스트:

http://jsperf.com/array-clear-methods/3

a = []; // 37% slower
a.length = 0; // 89% slower
a.splice(0, a.length)  // 97% slower
while (a.length > 0) {
    a.pop();
} // Fastest

9
변경 사항을 추가해도 플랫폼에 유의하지 않고 많이 사용하지 않습니다. 내 컴퓨터의 팝은 Chrome 34에서 매우 약간 빠르지 만 실제로 최신 Firefox의 []보다 느립니다.
매트 스타일

2
Windows NT 6.3 64 비트에서 Firefox 39.0 32 비트로 테스트하면 a = []가 가장 빠릅니다!
Reza-S4

5
이 테스트 결과에는 Chrome의 비린내가 분명히 있습니다. 팝핑 루프가 다른 3 가지 솔루션보다 훨씬 빠를 수 있습니까?
chqrlie

9
@chqrlie 그렇지 않습니다. 가장 느린 방법입니다. 벤치 마크 테스트에 결함이 있습니다.
Philippe Leybaert

15
이 답변이 잘못되었으므로 삭제하고 의미없는 결함이있는 테스트에 대한 가짜 증거로 연결하십시오.
제임스 웨이크 필드

35

배열을 "삭제"할 수 있도록 이것을 JavaScript 파일에 추가 할 수 있습니다.

Array.prototype.clear = function() {
    this.splice(0, this.length);
};

그런 다음 다음과 같이 사용할 수 있습니다.

var list = [1, 2, 3];
list.clear();

또는 무언가를 파괴하지 않으려면 다음을 수행하십시오.

if (!Array.prototype.clear) {
    Array.prototype.clear = function() {
       this.splice(0, this.length);
    };
}

많은 사람들이 Array와 같은 기본 객체를 수정해서는 안된다고 생각하며 동의합니다. 처리 방법을 결정할 때주의하십시오.


1
@naomik 왜 그런 일을하는지에 대한 당신의 추론을 설명 할 수 있습니까?
정의되지 않은

17
Array 및 String과 같은 자바 스크립트 기본 기능을 수정하는 것은 "분노"됩니다. 이미 존재하는 함수를 오버로드하고 객체 클래스를 휴지통에 버릴 수 있습니다. 이미 clear ()가 있고 다른 방식으로 작동 할 것으로 예상되는 모호한 자바 스크립트 엔진이있을 수 있습니다. 내가 말하는 것은 조심스럽게 밟아 라.
디자인 : Adrian

배열 구성원에 대해 foreach를 수행하면 갑자기 clear키가 포함되는 문제는 어떻습니까?
ErikE


19

답변과 댓글 모두에서 팝 / 시프트 성능에 관한 많은 혼란과 잘못된 정보가 있습니다. while / pop 솔루션은 예상대로 최악의 성능을 제공 합니다. 실제로 일어나는 것은 스 니펫을 루프에서 실행하는 각 샘플에 대해 설정이 한 번만 실행된다는 것입니다. 예 :

var arr = [];

for (var i = 0; i < 100; i++) { 
    arr.push(Math.random()); 
}

for (var j = 0; j < 1000; j++) {
    while (arr.length > 0) {
        arr.pop(); // this executes 100 times, not 100000
    }
}

올바르게 작동하는 새로운 테스트를 만들었습니다.

http://jsperf.com/empty-javascript-array-redux

경고 : 이 버전의 테스트에서도 어레이 복제에 대부분의 테스트 시간이 걸리므로 실제 차이를 확인할 수 없습니다. 여전히 splice배열을 지우는 가장 빠른 방법 임을 보여줍니다 ( []가장 빠르지 만 실제로 기존 배열을 지우지 않기 때문에 고려하지 않음).


아주 좋은 지적입니다! 올바른 벤치 마크 결과로 원래 답변을 업데이트하겠습니다.
Philippe Leybaert

아무도 그 벤치 마크 오류를 발견하지 못했다고 믿을 수 없습니다. 50 만 회 이상의 조회수를 통해 누군가가이를 알아 차릴 수 있습니다. 훌륭한 작품 Diadistis
Philippe Leybaert

15

메모리 할당에 관심이있는 경우 크롬 개발자 도구의 타임 라인 탭 과 함께이 jsfiddle 과 같은 것을 사용하여 각 접근 방식을 비교할 수 있습니다 . 어레이를 '지운'후 가비지 콜렉션을 강제 실행하려면 맨 아래에있는 휴지통 아이콘을 사용하려고합니다. 이것은 당신이 선택한 브라우저에 대해 더 확실한 대답을 줄 것입니다. 여기에 많은 답변이 오래되어 있으며 그들에게 의존하지 않고 위의 @tanguy_k의 답변에서와 같이 테스트합니다.

(위의 탭에 대한 소개는 여기를 참조 하십시오 )

Stackoverflow는 jsfiddle을 복사하도록 강제합니다.

<html>
<script>
var size = 1000*100
window.onload = function() {
  document.getElementById("quantifier").value = size
}

function scaffold()
{
  console.log("processing Scaffold...");
  a = new Array
}
function start()
{
  size = document.getElementById("quantifier").value
  console.log("Starting... quantifier is " + size);
  console.log("starting test")
  for (i=0; i<size; i++){
    a[i]="something"
  }
  console.log("done...")
}

function tearDown()
{
  console.log("processing teardown");
  a.length=0
}

</script>
<body>
    <span style="color:green;">Quantifier:</span>
    <input id="quantifier" style="color:green;" type="text"></input>
    <button onclick="scaffold()">Scaffold</button>
    <button onclick="start()">Start</button>
    <button onclick="tearDown()">Clean</button>
    <br/>
</body>
</html>

자바 스크립트는 객체 배열을 언급하지 않고 다른 기본 유형과 다르게 문자열을 관리하므로 배열 요소의 유형에 따라 달라질 수 있습니다. 유형에 따라 달라질 수 있습니다.


15

당신은 쉽게 당신을 위해 그렇게 변경하는 기능을 만들 수 있습니다 길이 또는에 추가 네이티브 배열remove()재사용 기능을.

이 배열이 있다고 상상해보십시오.

var arr = [1, 2, 3, 4, 5]; //the array

좋아, 그냥 이것을 실행하십시오 :

arr.length = 0; //change the length

결과는 다음과 같습니다.

[] //result

배열을 비우는 쉬운 방법 ...

또한 루프가 필요하지 않지만 다른 방법으로 사용할 수 있습니다.

/* could be arr.pop() or arr.splice(0)
don't need to return as main array get changed */

function remove(arr) {
  while(arr.length) {
    arr.shift(); 
  }
}

예를 들어 다음과 같이 생각할 수있는 까다로운 방법이 있습니다.

arr.splice(0, arr.length); //[]

따라서 arr에 5 개의 항목이 있으면 0에서 5 개의 항목을 스 플라이 싱하므로 배열에 아무것도 남지 않습니다.

또한 단순히 배열을 다시 할당하는 것과 같은 다른 방법도 있습니다.

arr = []; //[]

배열 함수를 보면 다른 방법이 많이 있지만 가장 권장되는 방법은 길이를 변경하는 것입니다.

처음에 말했듯이 remove ()는 질문에 대한 답변이므로 프로토 타입을 만들 수도 있습니다. 위의 방법 중 하나를 선택하고 JavaScript로 Array 객체로 프로토 타입을 만들 수 있습니다.

Array.prototype.remove = Array.prototype.remove || function() {
  this.splice(0, this.length);
};

그리고 자바 스크립트 응용 프로그램에서 배열을 비우려면 다음과 같이 간단히 호출 할 수 있습니다.

arr.remove(); //[]

arr.length = 0; // 길이 변경
Ajay Malhotra

14
Array.prototype.clear = function() {
    this.length = 0;
};

그리고 그것을 부르십시오 : array.clear();


77
기본 개체를 수정하지 마십시오.
감사합니다

21
사람들이 왜이 대답을 받아 들여 프로토 타입 함수에 넣는 경향이 있는가? 실제로 프로젝트에서이 작업을 수행합니까? 모든 프로젝트에 포함 할 프로토 타입 추가 라이브러리가 있습니까?
nurettin

4
왜 array.length = 0을 입력하지 않습니까?
디자인 : Adrian

10
@naomik "기본 개체를 수정하지 마십시오." -나는 이것에 완전히 동의하지만, 문장 자체를 반복하는 것은 오만한 것입니다. 그러한 해결책을 제안하는 사람은 그 결과를 알지 못할 가능성이 높으며, 간단한 설명이나 링크를 제공하는 대신이 줄을 떨어 뜨려도 "우리, 당신보다 똑똑한 사람들, 그렇지 않으면 "우리가 더 잘 알고 있기 때문에 .
John Weisz


12

A.splice(0);

방금 작업중 인 일부 코드 에서이 작업을 수행했습니다. 배열이 지워졌습니다.


아니요 이름이 지정된 배열 컨테이너를 새로 만든 익명 컨테이너로 바꿨습니다. `var A = [1,2,3,4]; var B; B = A. 스플 라이스 (0); console.log (A); console.log (B); '
Bekim Bacaj

12

당신이 사용하는 경우

a = []; 

그런 다음 a의 참조가 이미 다른 변수에 할당 된 경우 a에 새 배열 참조를 할당하는 경우 해당 배열도 비우지 않으므로 가비지 수집기가 해당 메모리를 수집하지 않습니다.

예를 들어.

var a=[1,2,3];
var b=a;
a=[];
console.log(b);// It will print [1,2,3];

또는

a.length = 0;

을 지정 a.length하면 배열의 경계가 재설정되고 나머지 배열 요소의 메모리는 가비지 수집기에 의해 연결됩니다.

이 두 가지 솔루션 대신 더 좋습니다.

a.splice(0,a.length)

while(a.length > 0) {
    a.pop();
}

kenshou.html의 이전 답변에 따르면 두 번째 방법이 더 빠릅니다.


10
에 대한 잘못된 것 외에도이 a.length새로운 답변이 스레드에 추가하는 것을 보지 못합니까?
Bergi

난 그냥 배열에 대한 실제 메모리 표현에 대해 초점을 맞추고 자 @Bergi
Laxmikant Dange

a.length=0;수행 할 때 어떤 JS 엔진이 새로운 배열을 생성하는지 확인할 소스 가 있습니까? 어떻게 그 엔진에 대한 행동 것 a.length=500;a.length=4;?
joeytwiddle

IE, Firefox, Chrome과 같은 대부분의 브라우저에서 시도해 보았습니다. 새로운 배열을 만들고 있습니다. 길이를 0보다 크게 설정하면 정의되지 않은 요소로 배열을 생성합니다. 즉, 일부 메모리 위치 만 보유합니다.
Laxmikant Dange

1
var a = [1]; var b = a; a.length = 0; console.log(b)prints Array [ ]이므로 나에게 새로운 배열을 만드는 것처럼 보이지 않습니다.
John Montgomery

9

Jan 의 초기 제안 수정 된 버전을 사용하십시오 .

var originalLength = A.length;
for (var i = originalLength; i > 0; i--) {
     A.pop();
}

12
왜 그런 일을 하시겠습니까? 왜 같은 일을하기 위해 두 개의 변수와 코드를 더 추가해야합니까?
Killah

6

상수를 사용하면 선택의 여지가 없습니다.

const numbers = [1, 2, 3]

재 지정할 수 없습니다 :

numbers = []

자르기 만 가능합니다 :

numbers.length = 0

5

여기에 이미지 설명을 입력하십시오

어레이의 현재 메모리 위치를 비우려면 다음을 사용하십시오. 'myArray.length = 0'또는'myArray.pop() UN-till its length is 0'

  • length: 언제든지 배열을 자르도록 length 속성을 설정할 수 있습니다. length 속성을 변경하여 배열을 확장하면 실제 요소 수가 증가합니다.
  • pop() : pop 메서드는 배열에서 마지막 요소를 제거하고 제거 된 값을 반환합니다.
  • shift(): shift 메소드는 0 인덱스 에서 요소를 제거하고 연속 인덱스에서 값을 아래로 이동 한 다음 제거 된 값을 리턴합니다.

예:

var arr = ['77'];
arr.length = 20;
console.log("Increasing : ", arr); // (20) ["77", empty × 19]
arr.length = 12;
console.log("Truncating : ", arr); // (12) ["77", empty × 11]

var mainArr = new Array();
mainArr = ['1', '2', '3', '4'];

var refArr = mainArr;
console.log('Current', mainArr, 'Refered', refArr);

refArr.length = 3;
console.log('Length: ~ Current', mainArr, 'Refered', refArr);

mainArr.push('0');
console.log('Push to the End of Current Array Memory Location \n~ Current', mainArr, 'Refered', refArr);

mainArr.poptill_length(0);
console.log('Empty Array \n~ Current', mainArr, 'Refered', refArr);

Array.prototype.poptill_length = function (e) {
  while (this.length) {
    if( this.length == e ) break;

    console.log('removed last element:', this.pop());
  }
};

  • new Array() | [] 사용하여 새로운 메모리 위치에 배열을 만들 Array constructor거나 array literal.

    mainArr = []; // a new empty array is addressed to mainArr.
    
    var arr = new Array('10'); // Array constructor
    arr.unshift('1'); // add to the front
    arr.push('15'); // add to the end
    console.log("After Adding : ", arr); // ["1", "10", "15"]
    
    arr.pop(); // remove from the end
    arr.shift(); // remove from the front
    console.log("After Removing : ", arr); // ["10"]
    
    var arrLit = ['14', '17'];
    console.log("array literal « ", indexedItem( arrLit ) ); // {0,14}{1,17}
    
    function indexedItem( arr ) {
        var indexedStr = "";
        arr.forEach(function(item, index, array) {
            indexedStr += "{"+index+","+item+"}";
            console.log(item, index);
        });
        return indexedStr;
    }
  • slice() 슬라이스 함수를 사용함으로써, 새로운 메모리 어드레스를 갖는, 원래의 어레이로부터 요소의 얕은 사본을 얻으므로, cloneArr에 대한 어떠한 수정도 실제의 어레이에 영향을 미치지 않는다.

    var shallowCopy = mainArr.slice(); // this is how to make a copy
    
    var cloneArr = mainArr.slice(0, 3); 
    console.log('Main', mainArr, '\tCloned', cloneArr);
    
    cloneArr.length = 0; // Clears current memory location of an array.
    console.log('Main', mainArr, '\tCloned', cloneArr);

"length : 배열의 길이가 지정된 크기가 될 때까지 팝" 이 말도 안되는 사람은 누구입니까?
Bekim Bacaj

@BekimBacaj 본질적으로 동일한 효과가 있습니다. 아마 length = ?그냥 대신 말했을 것입니다 length.
Tuupertunut

@ BekimBacaj 내 대답을 업데이트했습니다. 길이가 길이까지 팝한다고 가정했지만 길이가 자르거나 배열의 크기가 커지는 것을 수정했습니다.
Yash

3

아무도 아직 이것을 제안하지 않은 것에 놀랐습니다.

let xs = [1,2,3,4];
for (let i in xs)
    delete xs[i];

이것은 다른 솔루션과는 상당히 다른 상태로 배열을 생성합니다. 어떤 의미에서 배열은 '비워졌습니다'.

xs
=> Array [ <4 empty slots> ]

[...xs]
=> Array [ undefined, undefined, undefined, undefined ]

xs.length
=> 4

xs[0]
=> ReferenceError: reference to undefined property xs[0]

당신이 동등한 배열을 생성 할 수 있습니다 [,,,,]또는Array(4)


7
"배열의 모든 요소를 ​​정의되지 않은 요소로 변환하는 방법"과 같은 다른 질문에 대한 해답이 될 수 있습니다.
Ruben

내부적으로 정의되지 않은 요소와 빈 슬롯 ( "구멍") 사이에는 차이가 있지만
Cauterite

-9

Angular 2+ FormArray를 비우려면 아래를 사용하십시오.

public emptyFormArray(formArray:FormArray) {
    for (let i = formArray.controls.length - 1; i >= 0; i--) {
        formArray.removeAt(i);
    }
}

10
이것은 관련이 없으며 JavaScript조차도 아닙니다.
Emile Bergeron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.