JavaScript에서 배열의 길이를 초기화하는 방법은 무엇입니까?


542

JavaScript의 배열 ( w3schools 및 devguru 포함)에서 읽은 대부분의 자습서 는 var test = new Array(4);구문을 사용하여 Array 생성자에 정수를 전달하여 특정 길이의 배열을 초기화 할 수 있다고 제안 합니다.

내 js 파일 에서이 구문을 자유롭게 사용한 후 jsLint를 통해 파일 중 하나를 실행 했으며 놀라웠 습니다.

오류 : 1 행 문자 22에 문제가 있습니다. ')'이 예상되었지만 '4'가 표시되었습니다.
var test = new Array (4);
1 행 문자 23 문제 : 예상되는 ';' 대신 ')'를 보았습니다.
var test = new Array (4);
1 행 문자 23의 문제점 : 식별자를 예상하고 대신 ')'를 보았습니다.

jsLint의 동작에 대한 설명을 읽은 후에 는 jsLint가 실제로 new Array()구문을 좋아하지 않는 것처럼 보이고 대신 선호합니다.[] 배열을 선언 할 때 합니다.

그래서 몇 가지 질문이 있습니다.

먼저 왜? 를 사용하여 위험을 감수하고 있습니까?new Array()구문을 대신 있습니까? 알아야 할 브라우저 비 호환성이 있습니까?

둘째, 대괄호 구문으로 전환하면 배열을 선언하고 길이를 한 줄로 설정하는 방법이 있습니까? 아니면 다음과 같이해야합니다.

var test = [];
test.length = 4;

표준 JS는 또한 조언 에 대해 사용new Array()일반적으로,하지만 크기를 지정 괜찮다. 모든 것이 전체 컨텍스트를 통해 코드 일관성에 달려 있다고 생각합니다.
— cregox

보다 견고한 배열 구조를 미리 할당하려는 경우 Typed Arrays가 있습니다. 하는 것으로 성능 이점은 다를 수 있습니다
— rovyko

답변:


398
  1. 왜 길이를 초기화하고 싶습니까? 이론적으로는 이것이 필요하지 않습니다. length배열 을 사용 하는지 여부를 확인하기 위해 를 사용하는 모든 테스트 에서 배열이 비어 있지 않은 것으로보고 하기 때문에 혼동 될 수 있습니다 .
    일부 테스트에 따르면 나중에 배열이 채워지면 큰 배열의 초기 길이를 설정하는 것이 더 효율적일 수 있지만 성능 향상 (있는 경우)은 브라우저마다 다릅니다.

  2. new Array()생성자가 모호하기 때문에 jsLint는 마음에 들지 않습니다 .

    new Array(4);

    길이가 4 인 빈 배열 을 만듭니다.

    new Array('4');

    값을 포함 하는 배열 을 만듭니다 '4'.

귀하의 의견과 관련하여 : JS에서는 배열의 길이를 초기화 할 필요가 없습니다. 동적으로 자랍니다. 예를 들어 길이를 일부 변수에 저장할 수 있습니다.

var data = [];
var length = 5; // user defined length

for(var i = 0; i < length; i++) {
    data.push(createSomeObject());
}

13
배열의 객체 수는 사용자 정의되어 있으므로 사용자가 숫자를 선택한 다음 많은 슬롯으로 배열을 초기화 할 수있었습니다. 그런 다음 for배열의 길이를 반복하여 채우는 루프를 실행 합니다. JavaScript에서 다른 방법으로이 작업을 수행 할 수 있으므로 "왜이 작업을 원하십니까?" "다른 언어로 프로그래밍하는 동안 형성된 오래된 습관 때문에." :)
— Michael Martin-Smucker

4
@mlms 배열 길이를 설정하는 대신 for 루프가 사용자 정의 숫자를 반복하도록 한 다음 반복합니다. 더 이해가되지 않습니까?
— Šime Vidas

151
<blockquote> 왜 길이를 초기화 하시겠습니까? 이론적으로는 이것이 필요하지 않습니다. 배열이 비어 있는지 아닌지를 알아 내기 위해 길이를 사용하는 모든 테스트는 실패 할 것입니다. </ blockquote> 음, 아마도 성능 ? 배열의 기존 요소를 즉시 추가하는 것보다 빠릅니다.
— codehead

45
"오래된 프로그래밍 습관을 포기할 시간"이라는 의견은 실제로 불필요합니다. 올바르게 구조화 된 언어는 항상 ecmascript mombo jambo를 능가합니다
— user151496

10
@codehead :이 인용에 대한 응답으로 : "배열의 기존 요소를 즉시 추가하는 것보다 빠릅니다.": new Array(10)10 개의 정의되지 않은 요소가있는 배열을 만들지는 않습니다. 단순히 길이가 10 인 빈 배열을 만듭니다. 불쾌한 진실에 대한이 답변 참조 : stackoverflow.com/questions/18947892/…
— Milimetric

598
  • Array(5) 길이가 5이지만 값이없는 배열을 제공하므로 반복 할 수 없습니다.

  • Array.apply(null, Array(5)).map(function () {}) 길이가 5이고 값으로 정의되지 않은 배열을 제공하므로 반복 할 수 있습니다.

  • Array.apply(null, Array(5)).map(function (x, i) { return i; }) 길이가 5이고 값이 0,1,2,3,4 인 배열을 제공합니다.

  • Array(5).forEach(alert)아무것도하지 않습니다, Array.apply(null, Array(5)).forEach(alert)당신에게 5 개의 경고를줍니다

  • ES6Array.from당신이 사용할 수 있도록 지금 우리에게 제공Array.from(Array(5)).forEach(alert)

  • 당신이 특정 값으로 초기화하려면, 다음이 좋은 알고에 ...
    Array.from('abcde'), Array.from('x'.repeat(5))
    또는Array.from({length: 5}, (v, i) => i) // gives [0, 1, 2, 3, 4]


11
이것이 내가 찾던 것입니다. 논리적 인 순서로 맵을 적용하고 싶었습니다. 이 작업을 수행해야합니다. 감사합니다!
— jedd.ahyoung

3
왜 Array.apply ()가 값으로 정의되지 않습니까?
— wdanxna

5
@wdanxna Array는 여러 인수가 주어지면 arguments객체를 반복하고 각 값을 새 배열에 명시 적으로 적용합니다. Array.apply배열이나 length 속성을 가진 객체 를 호출 하면 length Array를 사용하여 새 배열의 각 값을 명시 적으로 설정합니다. 이것이 Array(5)5 개의 배열을 Array.apply(null, Array(5))제공하는 반면 5 개의 정의되지 않은 배열 을 제공하는 이유 입니다. 자세한 내용은 이 답변을 참조하십시오 .
— KylePlusPlus

2
Array (5)와 new Array (5) 사이에 차이점이 있습니까?
— Petr Hurtak

2
Array.apply(null, Array(5)) 도 같이 쓸 수있다 Array.apply(null, {length: 5}). 실제로 큰 차이는 없지만, 후자는 의도가 length 5포함 된 배열이 아니라의 배열 을 만드는 것임을 분명하게 알 수 있습니다.5
— AlexMorley-Finch

271

ES2015.fill() 를 사용하면 다음과 같이 간단하게 수행 할 수 있습니다.

// `n` is the size you want to initialize your array
// `0` is what the array will be filled with (can be any other value)
Array(n).fill(0)

어느 것보다 훨씬 간결합니다 Array.apply(0, new Array(n)).map(i => value)

0in 을 제거하고 .fill()인수없이 실행할 수 있으며 배열을로 채 웁니다 undefined. ( 그러나 이것은 Typescript에서 실패합니다 )


1
@AralRoca 항상 MDN 페이지에 제공된 Polyfill을 사용 하거나 Modernizr 사용을 고려할 수 있습니다.
— AP.

4
예, 코멘트하기 전에 시도하십시오
— AP.

1
@GarretWilson 및 @Christian 그것은 사양에 있습니다. When Array is called as a function rather than as a constructor, it also creates and initializes a new Array object. Thus the function call Array(…) is equivalent to the object creation expression new Array(…) with the same arguments
— AP.

1
@AP., 0은 중복입니다. DoArray(n).fill()
— Pacerier

2
@Pacerier 0이 중복 된 것으로 생각하지 않습니다. es6 유형 정의에 따르면 함수 서명은 다음과 같습니다. fill (value : T, start ?: number, end ?: number) : this; 따라서 채우기 값은 선택 사항으로 보이지 않습니다. 함수 호출이 위에 작성되면 타입 스크립트 컴파일이 실패합니다.
— Micha Schwab

149
[...Array(6)].map(x => 0);
// [0, 0, 0, 0, 0, 0]

또는

Array(6).fill(0);
// [0, 0, 0, 0, 0, 0]

참고 : 빈 슬롯을 반복 할 수 없습니다. Array(4).forEach(() => …)


또는

( typescript safe )

Array(6).fill(null).map((_, i) => i);
// [0, 1, 2, 3, 4, 5]

또는

함수를 사용하는 고전적인 방법 (모든 브라우저에서 작동)

function NewArray(size) {
    var x = [];
    for (var i = 0; i < size; ++i) {
        x[i] = i;
        return x;
    }
}

var a = NewArray(10);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

중첩 배열 만들기

직관적 으로 2D 배열을 fill만들 때 새 인스턴스를 만들어야합니다. 그러나 실제로 일어날 것은 동일한 배열이 참조로 저장된다는 것입니다.

var a = Array(3).fill([6]);
// [  [6], [6], [6]  ]

a[0].push(9);
// [  [6, 9], [6, 9], [6, 9]  ]

해결책

var a = [...Array(3)].map(x => []);

a[0].push(4, 2);
// [  [4, 2], [], []  ]

따라서 3x2 배열은 다음과 같습니다.

[...Array(3)].map(x => Array(2).fill(0));
// [  [0, 0], [0, 0], [0, 0]  ]

N 차원 배열

function NArray(...dimensions) {
    var index = 0;
    function NArrayRec(dims) {
        var first = dims[0], next = dims.slice().splice(1); 
        if(dims.length > 1) 
            return Array(dims[0]).fill(null).map((x, i) => NArrayRec(next ));
        return Array(dims[0]).fill(null).map((x, i) => (index++));
    }
    return NArrayRec(dimensions);
}

var arr = NArray(3, 2, 4);
// [   [  [ 0,  1,  2,  3 ] , [  4,  5,  6,  7]  ],
//     [  [ 8,  9,  10, 11] , [ 12, 13, 14, 15]  ],
//     [  [ 16, 17, 18, 19] , [ 20, 21, 22, 23]  ]   ]

체스 판 초기화

var Chessboard = [...Array(8)].map((x, j) => {
    return Array(8).fill(null).map((y, i) => {
        return `${String.fromCharCode(65 + i)}${8 - j}`;
    });
});

// [ [A8, B8, C8, D8, E8, F8, G8, H8],
//   [A7, B7, C7, D7, E7, F7, G7, H7],
//   [A6, B6, C6, D6, E6, F6, G6, H6],
//   [A5, B5, C5, D5, E5, F5, G5, H5],
//   [A4, B4, C4, D4, E4, F4, G4, H4],
//   [A3, B3, C3, D3, E3, F3, G3, H3],
//   [A2, B2, C2, D2, E2, F2, G2, H2],
//   [A1, B1, C1, D1, E1, F1, G1, H1] ]

1
a[0].push(9); // [ [6, 9], [6], [6] ] 되어야 a[0].push(9); // [ [6, 9], [6, 9], [6, 9] ] 하나 개 배열을 돌연변이하면 나머지에 영향을 미치는 각각의 중첩 배열은, 기준으로서 저장되기 때문이다. 내가 생각하기는하지만 잘못 입력했을 수도 있습니다. :)
— Alex_Zhong

@Alex_Zhong tru 감사합니다, 편집에서 잃어버린
— Vlad

68

가장 짧은 :

[...Array(1000)]

10
공감되었지만 한 가지주의 사항 은 위의 줄을 역 참조하려고 시도하기 때문에 JS를 [사용하지 않고 JS에서 줄을 시작해서는 안됩니다 ;. 따라서 코드의 어느 부분에서나이 라인을 예측 가능하게 사용하는 안전한 방법은 다음과 같습니다.;[...Array(1000)]//.whateverOpsNeeded()
— AP.

실제로는 아닙니다. 개발자 도구를 사용해보십시오. [...Array(5)].map((item, index) => ({ index }))[...Array(5)]; console.log('hello');
— Michael Mammoliti

2
여러 줄로 된 js 파일에서 사용해보십시오. 첫 줄이 const a = 'a'다음 줄인 경우 [...Array(5)].//irrelevent. 첫 번째 줄로 무엇을 해결할 것이라고 생각하십니까? 그것은 것 const a = 'a'[...Array(5)]: 초래할 것이다Uncaught SyntaxError: Unexpected token ...
— AP를.

7
사실이지만이 경우에는 문제가 다른 곳이라고 말할 것입니다. 현재 세미콜론과 보풀이 중요합니다.
— Michael Mammoliti 2016 년

8
@AP이 예제는 많은 스타일 가이드가 모든 문장을 세미콜론으로 끝내야하는 이유입니다. const a = 'a'이 경우 Lint 오류가 발생합니다. 어쨌든, 그것은 실제로이 답변과 관련이 없습니다.
— graup

41

ES6의 소개 Array.from당신은을 만들 수 있습니다 Array어떤에서 "같은 배열" 또는 반복 가능 객체는 객체 :

Array.from({length: 10}, (x, i) => i);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

이 경우 "배열 형" 객체 {length: 10}의 최소 ​​정의, 즉 속성이 정의 된 빈 객체를 나타 냅니다.length

Array.from 결과 배열에 두 번째 인수를 매핑 할 수 있습니다.


2
나는 [... 어레이 (10)] 더 나은 생각 @dain stackoverflow.com/a/47929322/4137472이
— 알렉산더 Shutau

1
왜 더 좋아? Array 생성자를 사용하지 않는 것이
— 좋으며

26

길이 속성을 4로 초기화합니다.

var x = [,,,,];

3
영리 해요 길이를 설정하기 위해 변수를 사용할 수 없기 때문에 생성자의 유연성이 없지만 처음에 문구를 썼을 때 내 질문에 대답하므로 +1입니다.
— Michael Martin-Smucker

12
성능이 정말로 중요 할 때 300 개 항목에 대해 그렇게 생각한다고 상상해보십시오!
— Marco Luglio

9
크기가 작은 어레이를 사전 할당 할 때는 성능이 크게 향상되지 않을 수 있습니다. 더 큰 어레이를 만들 때 성능 차이가 더 잘 인식됩니다. 이 경우 쉼표로 초기화하면 약간 압도적입니다.
— Marco Luglio

6
최종 쉼표, 때로는 4, 때로는 5 때문에 브라우저마다 다른 결과가 나올 것이라고 생각합니다. stackoverflow.com/questions/7246618/…
— jperelli

1
어때요 var size = 42; var myArray = eval("["+",".repeat(size)+"]");? (심각하지는 않습니다.)
— xoxox

15

한 줄로 길이를 설정할 수있는 기능적 솔루션이 없다는 것이 놀랍습니다. 다음은 UnderscoreJS를 기반으로합니다.

var test = _.map(_.range(4), function () { return undefined; });
console.log(test.length);

위에서 언급 한 이유로 배열을 특정 값으로 초기화하지 않으려는 경우이 작업을 수행하지 마십시오. Lo-dash 및 Lazy를 포함하여 범위를 구현하는 다른 라이브러리가 있으며 성능 특성이 다를 수 있습니다.


밑줄 검은 마술은 실제로 여기에 필요하지 않습니다. 의존성은 설탕과 같으며 처음에는 달콤 해 보이지만 알기 전에 당뇨병에 걸리게됩니다.
— Romain Vincent

9

사람들은 아직 오래된 습관을 포기하지 마십시오. 메모리를 한 번 할당 한 다음 해당 배열의 항목을 사용하여 작업하고 (오래된 시점), 배열이 커질 때 여러 번 할당하는 것 (필수적으로 다른 제안 된 방법으로 시스템이 수행하는 작업)간에 속도에 큰 차이가 있습니다. .

더 큰 배열로 멋진 것을 원할 때까지는 물론 이것도 중요하지 않습니다. 그럼 그렇습니다.

배열의 초기 용량을 설정하는 현재 JS에는 여전히 옵션이없는 것처럼 보이므로 다음을 사용합니다 ...

var newArrayWithSize = function(size) {
  this.standard = this.standard||[];
  for (var add = size-this.standard.length; add>0; add--) {
   this.standard.push(undefined);// or whatever
  }
  return this.standard.slice(0,size);
}

다음과 같은 장단점이 있습니다.

  • 이 메소드는 다른 함수가 함수를 처음 호출하는 데 걸리는 시간이 더 길지만, 더 큰 배열을 요구하지 않는 한 나중에 호출하는 데는 시간이 거의 없습니다.
  • standard배열은 영구적으로 요구 한 최대 규모의 배열만큼 공간으로 확보 않습니다.

그러나 그것이 당신이하고있는 일에 맞으면 지불 할 수 있습니다. 비공식적 인 타이밍

for (var n=10000;n>0;n--) {var b = newArrayWithSize(10000);b[0]=0;}

꽤 빠른 속도로 (n = 1000000이면 약 5 초가 걸리면 10000의 경우 약 50ms)

for (var n=10000;n>0;n--) {
  var b = [];for (var add=10000;add>0;add--) {
    b.push(undefined);
  }
}

1 분 이상 (동일한 크롬 콘솔에서 10000의 경우 약 90 초 또는 약 2000 배 느림) 그것은 할당 일뿐 만 아니라 10000 푸시, for 루프 등입니다.


배열의 끝에 도달 할 때마다 배열을 복제하면 n 값을 삽입하는 복잡성이 여전히 O (n)이므로 복잡도의 차이는 없지만 느립니다.
— Tomer Wolberg

@TomerWolberg를 잘 잡았는데, 저는 문구를 바 꾸었습니다. 푸시 방법이 슬라이스별로 개별 멤버의 초기화 / 복사보다 더 복잡한 지 여부가 중요합니다. AFAIK는 둘 다 일정한 시간이며, 적어도 그들이 될 수 있기 때문에 대신 'speed'라는 단어를 사용했습니다.
— 윌

8

(이것은 아마도 의견으로 더 좋았지 만 너무 길었습니다.)

그래서 이것을 읽은 후에 나는 사전 할당이 실제로 더 빠르면 궁금했습니다. 이론적으로는 그렇게해야하기 때문입니다. 그러나이 블로그는 http://www.html5rocks.com/en/tutorials/speed/v8/ 에 대한 조언을 제공했습니다 . .

그래도 확실하지 않아 테스트에 넣었습니다. 그리고 실제로는 느려 보입니다.

var time = Date.now();
var temp = [];
for(var i=0;i<100000;i++){
    temp[i]=i;
}
console.log(Date.now()-time);


var time = Date.now();
var temp2 = new Array(100000);
for(var i=0;i<100000;i++){
    temp2[i] = i;
}
console.log(Date.now()-time); 

이 코드는 몇 번의 캐주얼 실행 후 다음을 생성합니다.

$ node main.js 
9
16
$ node main.js 
8
14
$ node main.js 
7
20
$ node main.js 
9
14
$ node main.js 
9
19

3
흥미롭게도 예상치 못한 것 같았 기 때문에 JSPerf 테스트를했습니다 . Chrome 결과는 노드 테스트와 일치하지만 배열에 공간을 미리 할당하면 Firefox와 IE가 약간 더 빠릅니다.
— Michael Martin-Smucker

1
@ MichaelMartin-Smucker Wait ... 이것은 V8이 실제로 완전히 최적화되고 완벽하지 않다는 것을 의미합니까?!?!? : P
— Zeb McCorkle

1
@ MichaelMartin-Smucker-방금 Chrome 버전 42.0.2311.90에서 jsperf를 실행했으며 (구체적으로-Windows Server 2008 R2 / 7 64 비트의 Chrome 42.0.2311.90 32 비트에서 테스트) 동적 크기 배열은 69 % 느 렸습니다. .
— 옐런

1
같게. (원래 노드 테스트를 작성했습니다.) 동적 크기의 창에서 42.0.2311.90 크롬에서 81 % 느려졌습니다 :). 그러나 우리의 원래 테스트는 1 년 전에 끝났습니다. 시간은
— 미끄러짐

1
매혹적인 ... jsperf의 결과에서 사전 할당 된 것처럼 보이는 것은 Chrome 38에서 크게 향상되었습니다. 미래!
— Michael Martin-Smucker

8
var arr=[];
arr[5]=0;
alert("length="+arr.length); // gives 6

2
예. 그러나 console.log (arr)은 [5: 0]이것이 희소 배열이며 아마도 원하는 것이 아닙니다.
— dreftymac

7

다른 해결책이 있습니다.

var arr = Array.apply( null, { length: 4 } );
arr;  // [undefined, undefined, undefined, undefined] (in Chrome)
arr.length; // 4

첫 번째 인수 apply()는 this 객체 바인딩이며 여기서는 신경 쓰지 않으므로로 설정하십시오 null.

Array.apply(..)Array(..)함수를 호출하고 { length: 3 }객체 값을 인수로 분산시킵니다 .


이 답변에 왜 공감대가 생겼는지 이해할 수 없습니다. 실제로 좋은 해킹입니다. new Array(n)이 배열을 초기화하는 데 사용할 수는 없지만 new Array(n).map(function(notUsed,index){...})@zangw가 언급 했듯이이 접근법을 사용하면 할 수 있습니다. 나에게서 +1
— Victor.Palyvoda

3

배열 생성자는 모호한 구문 을 가지고 있으며 JSLint는 결국 감정을 상하게합니다.

또한 예제 코드가 손상되면 두 번째 var문에서가 발생합니다 SyntaxError. length배열 의 속성 을 설정하므로 다른 속성 이 test필요하지 않습니다 var.

당신의 선택에 따라 array.length, 유일한 "깨끗한"것입니다. 질문은, 왜 먼저 크기를 설정해야합니까? 해당 종속성을 제거하기 위해 코드를 리팩터링하십시오.


Woops, 그 두 번째 좋은 눈 var test. 그것은 부주의 한 복사 및 붙여 넣기였습니다.
— Michael Martin-Smucker

@IvoWetzel, 성능을 향상시키기 위해 크기를 설정하려고합니다. JS 배열은 동적 배열 입니다. 크기를 설정하지 않으면 (또는 용량) JS는 기본 크기의 배열을 할당합니다. 적합 할 수있는 것보다 많은 요소를 추가하면 배열을 확장해야합니다. 즉, 내부적으로 새 배열을 할당 한 다음 모든 요소를 ​​복사합니다.
— Domi

3

Array의 길이가 일정하다고 가정합니다. Javascript에서 이것은 우리가하는 일입니다.

const intialArray = new Array(specify the value);


2

위에서 설명한 것처럼 사용 new Array(size)은 다소 위험합니다. 직접 사용하는 대신 "배열 생성기 기능"에 배치하십시오. 이 기능에 버그가 없는지 쉽게 확인할 수 있으며 new Array(size)직접 호출 할 위험이 없습니다 . 또한 선택적 초기 값을 지정할 수 있습니다. 이 createArray함수는 정확히 다음을 수행합니다.

function createArray(size, defaultVal) {
    var arr = new Array(size);
    if (arguments.length == 2) {
        // optional default value
        for (int i = 0; i < size; ++i) {
            arr[i] = defaultVal;
        }
    }
    return arr;
}

1

대부분의 대답에서는 fill그렇지 않으면 "반복 할 수 없으므로" 배열에 권장 되지만 사실이 아닙니다. 를 사용하지 않고 빈 배열을 반복 할 수 있습니다 forEach. while 루프, for 루프 및 i 루프는 정상적으로 작동합니다.

const count = Array(5);

작동하지 않습니다.

console.log('---for each loop:---');
count.forEach((empty, index) => {
    console.log(`counting ${index}`);
});

이 작품들 :

console.log('---for of loop:---');
for (let [index, empty] of count.entries()) {
  console.log(`counting for of loop ${index}`);
}

console.log('---for i loop:---');
for (let i = 0, il = count.length; i < il; ++i) {
  console.log(`counting for i loop ${i}`);
}

console.log('---while loop:---');
let index = 0;
while (index < count.length) { 
  console.log(`counting while loop ${index}`); 
  index++; 
}

이 바이올린을 확인위 예제를 을 .

또한 각도 *ngFor는 빈 배열로 잘 작동합니다.

<li *ngFor="let empty of count; let i = index" [ngClass]="
  <span>Counting with *ngFor {{i}}</span>
</li>

-1

다음을 사용하여 배열 길이를 설정할 수 있습니다 array.length = youValue

그래서 그것은

var myArray = [];
myArray.length = yourValue;

-3

사용하지 말아야 할 이유 new Array는 다음 코드에 의해 설명됩니다.

var Array = function () {};

var x = new Array(4);

alert(x.length);  // undefined...

다른 코드 는 배열 변수를 엉망. 나는 누군가가 그런 코드를 작성할 것이라고 조금은 알고 있지만 여전히 ...

또한 Felix King이 말했듯이 인터페이스가 약간 일치하지 않아 추적하기 어려운 버그가 발생할 수 있습니다.

길이가 x 인 배열이 정의되지 않은 채 채워진 경우 다음과 같이 new Array(x)할 수 있습니다.

var x = 4;
var myArray = [];
myArray[x - 1] = undefined;

alert(myArray.length); // 4

48
이 추론에 따르면 다른 코드는 엉망이 될 수 있으므로 alertand를 사용하면 안됩니다 undefined. 두 번째 예는 이하 읽을 수 new Array(4), 당신에게 동일한 결과를 제공하지 않습니다 jsfiddle.net/73fKd
— 알렉세이 레베 데프

25
이 답변은 기괴합니다
— Marco Demaio

6
사람들이 JavaScript로 전역 객체를 엉망으로 만드는 것을 피할 수 없습니다. 단순히 그렇게하지 않거나 사람들이하는 프레임 워크를 사용하십시오.
— Richard Connamacher

크롬 repl에서 현재 : j = new Array (4); j. 길이; // 4에서 결과
— Parris
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.