일반적으로 배열을 반복 할 때 책의 솔루션과 마찬가지로 length
속성을 사용하려고합니다. 귀하의 솔루션은이 의 특정 특정 상황에서도 문제가 없지만 약점이 있습니다 : 어레이의 항목이 0
, null
, undefined
또는 false
인 모든 것이 "거짓"값이며 배열의 끝에 있지 않더라도 document.links[i]
은 거짓 일 수 있습니다.
예 : 3
, 2
및 1
,하지만 중지 경고합니다
var index, a;
a = [3, 2, 1, 0, -1, -2];
for (index = 0; a[index]; ++index) {
alert(a[index]);
}
.
3
,
2
,
1
,
0
,
-1
및
-2
을 경고 할 ...
var index, a;
a = [3, 2, 1, 0, -1, -2];
for (index = 0; index < a.length; ++index) {
alert(a[index]);
}
:에 비교.
다음과 같은 코드가 나타날 수 있습니다. for (index in a)
. 일반적으로 배열 인덱스를 통해 루프를 사용하지 마십시오. 이것은 for..in
의 오해를 기반으로합니다. (이에 대한 자세한 내용은 아래에 있습니다.)
(새로운 5th edition 사양의 경우 배열 항목을 반복하는 또 다른 방법이 있습니다 : forEach
함수입니다. 함수를주고 각 함수에 대해 호출합니다. 배열의 요소는. Details in this other answer.. 슬프게도, IE8를 지원하지 않지만 여러 옵션 "ES5 심"에 대한 — 검색 "을 shimmed"할 수있는 것들 중 하나입니다.)
배열에 대해 학습 할 때, Javascript 배열이 다른 언어의 배열과 매우 다르다는 것을 아는 것이 중요합니다.한 가지 들어, 그들은 (필연적으로) 배열이 아닙니다. 실제로, 그것들은 몇 가지 특별한 기능이 추가 된 정상적인 Javascript 객체입니다. Javascript 객체는 속성 맵이며 키를 값에 매핑합니다. obj
객체가 값 1
의 열쇠 "foo"
(문자열) 매핑
var obj = {foo: 1};
한다 : 예를 들어. 코드에서 리터럴 이름을 사용하거나 []
및 문자열을 사용하여 해당 속성에 액세스 할 수 있습니다. 물론 후자를 수행하는 경우 문자열 (리터럴 또는 변수 또는 표현식 등)을 사용할 수 있습니다. 따라서이 모든 결과는 같습니다.
x = obj.foo;
x = obj["foo"];
name = "foo";
x = obj[name];
name = "o";
x = obj["f" + name + name];
... 아이디어가 있습니다. []
에서 사용하는 문자열이 문자열로 평가되는 한 해당 키를 사용하여 값을 찾을 수 있습니다. 그러나 자바 스크립트는 암시 적 강제를 수행하므로이 작동 :이
var obj = {"1": "one"};
alert(obj[1]); // alerts "one"
내가 값 "one"
-"1"
라는 이름의 속성을 매핑했습니다. 그런 다음 문자열이 아닌 숫자를 사용하여 obj[1]
으로 찾습니다. 그건 괜찮아. 통역관은 그것을 나를 위해 끈으로 바꾸고 키 조회를 할거야.
이 모든 것이 어레이와 어떤 관련이 있습니까? 이것은 : 배열 인덱스는 단지이라는 속성 이름 일뿐입니다. 자바 스크립트 배열은 이러한 특수 기능 키를 값에 매핑하는 일반 객체입니다 :
그 숫자가 현재의 최대 인덱스에 존재하는보다 큰 경우, 이름을 숫자로 해석 될 수있는 속성을 설정할 때마다
배열에서 length
속성이 변경됩니다. 그래서 :
var a = ["zero"];
alert(a.length); // alerts 1
a[3] = "three";
alert(a.length); // alerts 4, because the max index is now 3
보다 크거나 새 길이에 해당하는 값이 숫자 이름을 가진 속성이있는 경우는, length
을 설정할 때마다
은 이러한 속성은 개체에서 삭제됩니다. var a = ["zero", "one", "two", "three"];
alert(a[3]); // alerts "three"
a.length = 3;
alert(a[3]); // alerts "undefined", the "3" property has been deleted
// only the "0", "1", and "2" properties remain
는 그들은 join
또는 splice
같은 Array.prototype으로, 상속 기능을위한 다양한 속성을 가지고있다.
그게 전부입니다. C, C++, Java 또는 대부분의 다른 언어의 배열과 같은 것이 없습니다.
var a = ["zero", "one", "two"];
a.foo = "bar";
alert(a[1]); // alerts "one", 1 is implicitly coerced to "1"
alert(a["1"]); // alerts "one"
alert(a.foo); // alerts "bar"
alert(a["foo"]); // alerts "bar"
그리고 for..in
것은 고장 곳은 다음과 같습니다 : 배열은 단지 추가 기능의 몇 개체 때문에 당신이 원하는 경우
, 당신은 배열에 다른 숫자가 아닌 속성을 넣을 수 있기 때문에
이
var a, name;
a = [1, 2, 3];
a.foo = "bar";
for (name in a) {
alert(name);
}
이 "1"
, "2"
,경고 : for..in
배열 인덱스를 통해 하지 루프를 수행, 그것은 속성 이름을 통해 루프및 "foo"
(특별한 순서는 없습니다). 어떻게하면 배열 인덱스 일 뿐이라고 생각했는지 알 수 있습니다.당신 은 루프 배열 인덱스로 사용할 수 있지만, 그것보다 가치가 더 복잡 :
for (name in a) {
if (String(Number(name)) === name && a.hasOwnProperty(name)) {
alert(name);
}
}
속성 이름은 숫자이며, 그 속성에 정의되어 있는지 여부를 확인하는 경우 먼저 확인합니다 그건 a
자체는 Array.prototype이 아닙니다 (배열은 Array 프로토 타입에서 속성을 상속받습니다). (이 후자의 검사는 아마도 그다지 중요하지 않을 것입니다. 누군가가 Array 프로토 타입에 숫자 형 속성을 추가하면 아주 나쁜 일을합니다. (tm)
예. 그렇습니다. –