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


542

JavaScript의 배열 ( w3schoolsdevguru 포함)에서 읽은 대부분의 자습서 는 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.