빌트인 오브젝트
Array 형태
배열 엘리먼트
인덱스
배열 특징
new Array()로 생성
Array()로 생성
대괄호로 생성
var book = ["책1", '책2'];
대괄호 안에 콤마로 구분하여 다수 작성 가능
String 타입은 큰따옴표, 작은따옴표 모두 가능
JS의 모든 타입의 값, 오브젝트 사용 가능
값을 작성하지 않고 콤마만 작성하면 undefined가 설정됨
var list = [12, 34, 56];
for (var k = 0; k < list.length; k++) {
log(list[k]);
};
// 12
// 34
// 56
var list = [[12, 34, 56]];
for (var k = 0; k < list.length; k++){
var one = list[k];
for (var m = 0; m < one.length; m++){
log(one[m]);
};
};
// 12
// 34
// 56
var list = [[[12, 34, 56]]];
for (var k = 0; k < list.length; k++){
var one = list[k];
for (var m = 0; m < one.length; m++){
var two = one[m];
for (var p = 0; p < two.length; p++){
log(two[p]);
};
};
};
// 12
// 34
// 56
Array 인스턴스 생성, 반환
배열 생성 기준
var obj = new Array();
log(typeof obj); // new Array()로 생성한 인스턴스 타입은 object
log(obj.length);
// object
// 0
var one = new Array(10, 20);
log(one);
var two = new Array([30, 40]);
log(two);
// [10, 20]
// [[30, 40]]
var obj = new Array(3);
log(obj);
// [undefined, undefined, undefined]
Array 인스턴스 생성, 반환
인스턴스 생성 논리
배열 [1, 2, 3]에서
열거/삭제는 할 수 없지만, 변경은 가능
length 값을 변경하려면 배열의 엘리먼트 수가 변경됨
var value = [1, 2, 3];
value.length = 5;
log(value);
// [1, 2, 3, undefined, undefined]
var value = [1, 2, 3];
value.length = 2; // 뒤의 엘리먼트가 삭제됨
log(value);
// [1, 2]
var value = [1, 2];
value[4] = 5;
log(value);
// [1, 2, undefined, undefined, 5]
var value = [1, 2];
value[value.length + 2] = 5;
log(value);
// [1, 2, undefined, undefined, 5]
var 변수는 삭제 불가
글로벌 변수는 삭제 가능
{name: value} 삭제 방법
인덱스로 배열의 엘리먼트 삭제
var value = 123;
log(delete value); // var 변수 삭제 불가능 => 삭제 실패로 처리하여 false 반환
// false
value = "글로벌 변수";
log(delete value); // var키워드 사용하지 않은 글로벌 변수는 삭제 가능 => 삭제해서 true 반환
try {
log(value); // value 없어서 에러
} catch(e){
log("존재하지 않음");
};
// true
// 존재하지 않음
var book = {title: "책"};
log(delete book.title); // 오브젝트이름.프로퍼티이름 형태로 작성
log(book.title); // 오브젝트에 프로퍼티 이름 없으면 undefined 반환
// true
// undefined
var book = {title: "책"};
log(delete book);
// var 변수에 오브젝트 할당하면 오브젝트 전체를 삭제 불가능
// ==> var 키워드를 사용해야 하는 또 하나의 목적
sports = {item: "축구"};
log(delete sports);
// false
// true
var value = [1, 2, 3, 4];
log(delete value[1]);
log(value.length); // length 줄지 않고 그대로 - 배열 처리 메커니즘 때문
// true
// 4
var value = [1, 2, 3, 4];
delete value[1];
log(value);
for (var k = 0; k < value.length; k++){
log(value[k]);
};
// [1, undefined, 3, 4]
// 1
// undefined
// 3
// 4
var value = [1. 2];
value.unshift(345, 67);
log(value);
// [345, 67, 1, 2]
var value = [1. 2];
value.push(345, 67);
log(value);
// [1, 2, 345, 67]
배열에 파라미터 값을 연결하여 반환
파라미터가 1차원 배열이면 값만 반영
var value = [1, 2];
var result = value.concat(3, 4);
log(result);
// [1, 2, 3, 4]
var value = [1, 2];
var result = value.concat([3], [4]);
log(result);
// [1, 2, 3, 4]
var origin = [1, 2, 3, 4, 5];
var result = origin.slice(1, 3);
log(result);
log(origin);
// [2, 3]
// [1, 2, 3, 4, 5]
var value = [1, 2, 3, 4, 5];
log(value.slice(true, 3));
log(value.slice(false, 3));
// [2, 3]
// [1, 2, 3]
log([1, 2, 3, 4, 5].slice(2)); // 2~끝
// [3, 4, 5]
log([1, 2, 3, 4, 5].slice(4, 3));
// []
var value = [1, 2, 3, 4, 5];
log(value.slice(-4, -2)); // 파라미터 값이 음수면 length 값을 더함 -4+5=1, -2+5=3 ==> slice(1, 3)
// [2, 3]
엘리먼트와 분리자를 하나씩 결합하여 문자열로 연결
마지막 엘리먼트는 분리자를 연결하지 않음
var value = [1, 2, 3];
var result = value.join("##");
log(result);
log(typeof result);
// 1##2##3
// string
var value = [1, 2, 3];
var result = value.join();
log(result);
// 1,2,3
<table>
)var value = [1, 2, 3];
var result = value.join("");
log(result);
// 123
var result = ["A", "B", "C"].toString();
log(result);
log([["가"]. ["다"]].toString()); // 2차원 배열의 각 엘리먼트 값을 1차원 배열로 펼치고, 다시 1차원을 문자열로 연결
// A,B,C
// 가,다
var value = [12, 34, 56];
log(value.toLocalString(
"zh-Hans-CN-u-nu-hanidec"));
// 一二.三四,五六
배열의 첫 번째 엘리먼트 삭제
삭제한 엘리먼트 값이 undefined로 남지 않고 완전히 삭제됨
var value = [1, 2, 34];
log(value.shift());
log(value);
// 1
// [2, 34]
var result = [].shift();
log(result);
// undefined
배열의 마지막 엘리먼트 삭제
삭제한 엘리먼트 값이 undefined로 남지 않고 완전히 삭제됨
var value = [1, 2, 34];
log(value.pop());
log(value);
// 34
// [1, 2]
var result = [].pop();
log(result);
// undefined
var value = [1, 2, 3, 4, 5];
log(value.splice(1, 3)); // 1번 인덱스부터 엘리먼트 3개 삭제. 뒤의 엘리먼트가 앞으로 당겨짐
log(value);
// [2, 3, 4]
// [1, 5]
var value = [1, 2, 3, 4, 5];
log(value.splice(1, 3, "A", "B"));
log(value);
// [2, 3, 4]
// [1, A, B, 5]
var value = [1, 2, 3, 4, 5];
log(value.splice());
log(value);
// []
// [1, 2, 3, 4, 5]
엘리먼트 값을 승순으로 정렬
정렬 기준은 엘리먼트 값의 Unicode
var value = [4, 2, 3, 1];
log(value.sort());
// [1, 2, 3, 4]
var value = ["A1", "A01", "B2", "B02"];
log(value.sort());
// [A01, A1, B02, B2]
var value = [4, 2, 3, 1];
log(value.sort());
log(value);
// [1, 2, 3, 4]
// [1, 2, 3, 4]
var value = [, , 1, 2];
log(value.sort());
// [1, 2, undefined, undefined]
var value = [101, 26, 7, 1234];
log(value.sort());
// [101, 1234, 26, 7]
var value = [101, 26, 7, 1234];
value.sort(function(one, two){
return one - two;
});
log(value);
// [7, 26, 101, 1234]
sort() 파라미터의 function(){}을 호출하면서 101과 26을 파라미터 값으로 넘김. 101이 one, 26이 two에 설정됨.
one(101) - two(26)의 결과는 양수이며 이 값을 반환
이때, 0보다 큰 값이 반환되면 배열에서 값의 위치를 바꿈. 즉, [26, 101, 7, 1234]
다시 콜백 함수를 호출하면서 101과 7을 넘겨줌. one(101) - two(7)의 결과는 양수이며 0보다 큰 값을 반환
반환 값이 0보다 크므로 배열에서 값의 위치를 바꿈. 즉, [26, 7, 101, 1234]
다시 함수 호출, 101과 1234 넘겨줌. one(101) - two(1234)의 결과는 음수이며 0보다 작은 값 반환
반환 값이 0보다 작거나 같으면 배열에서 값의 위치 바꾸지 않음. 즉, [26, 7, 101, 1234]
다시 처음으로 돌아가 바뀌는 것이 없을 때까지 배열의 엘리먼트 위치를 조정
var value = [1, 3, 7, 5];
log(value.reverse());
// [5, 7, 3, 1]
체크 대상이 배열이면 true, 아니면 false
isArray()는 함수
log(Array.isArray([1, 2])); // isArray()는 함수이므로 Array.isArray() 형태로 호출
log(Array.isArray(123));
// true
// false
log(typeof {a: 1});
log(typeof [1, 2]);
log(typeof null);
// object
// object
// object
파라미터 값과 같은 엘리먼트의 인덱스 반환
두 번째 파라미터의 인덱스부터 검색
String과 Array의 indexOf() 차이
var value = [1, 2, 5, 4, 5]; // number 타입
log(value.indexOf(5));
log(value.indexOf("5")); // 타입이 달라서 -1 반환
log(value.indexOf(5, 3)); // 3은 검색 시작 인덱스
// 2
// -1
// 4
log("ABCBC".indexOf("C", -2)); // String 오브젝트는 음수는 0으로 간주
var list = ["A", "B", "C", "B", "C"];
log(list.indexOf("C", -2)); // Array 오브젝트는 음수에 length 더해서 시작 인덱스
// 2
// 4
var value = [1, 2, 5, 2, 5];
log(value.lastIndexOf(5));
// 4
배열의 엘리먼트를 하나씩 읽어 가면서 콜백 함수 호출
콜백 함수 파라미터
var list = ["A", "B", "C"];
list.forEach(function(el, index, all){
log(el + ":" + index + ":" + all);
});
// A:0:A,B,C
// B:1:A,B,C
// C:2:A,B,C
break, continue 사용 불가. throw는 사용 가능
콜백 함수 분리(독립성)
var list = ["A", "B", "C"];
var fn = function(el, index, all){
log(el + ":" + index + ":" + all);
};
list.forEach(fn);
// A:0:A,B,C
// B:1:A,B,C
// C:2:A,B,C
var list = [1, 2];
var fn = function(el, index, all){
log(el + this.ten);
};
list.forEach(fn, {ten: 10});
// 11
// 12
forEach()를 시작할 때 반복 범위 설정
엘리먼트를 추가하더라도 처리하지 않음
var list = [1, 2, 3];
var fn = function(el, index, all){
if (index === 0){
list.push("AB"); // 반복 도중 배열에 엘리먼트 추가하면 처리하지 않음
};
log(el);
};
list.forEach(fn);
// 1
// 2
// 3
var list = [1, 2, 3];
var fn = function(el, index, all){
if (index === 0){
list[2] = 345;
};
log(el);
};
list.forEach(fn);
// 1
// 2
// 345
var list = [1, 2, 3];
var fn = function(el, index, all){
if (index === 0){
delete list[2];
};
log(el);
};
list.forEach(fn);
// 1
// 2
forEach()는 시맨틱 접근
for()는 함수 코드를 읽어야 알 수 있음
forEach()는 반복만 하며
forEach()는 인덱스 0부터 시작
forEach()처럼 시맨틱 접근
배열의 엘리먼트를 하나씩 읽어가면서
false가 되는 조건이 배열의 앞에 있을 때 효율성 높음
var value = [20, 10, 30, 40];
var fn = function(el, index, all){
log(el);
return el > 15;
};
var result = value.every(fn);
log("결과:", result);
// 20
// 10
// 결과:false
every()처럼 시맨틱 접근
단, true를 반환할 때까지 콜백 함수 호출
true가 되는 조건이 배열의 앞에 있을 때 효율성 높음
var value = [20, 10, 30, 40];
var fn = function(el, index, all){
log(el);
return el > 15;
};
var result = value.some(fn);
log("결과:", result);
// 10
// 20
// 결과:true
forEach()처럼 시맨틱 접근
배열의 엘리먼트를 하나씩 읽어가면서
조건에 맞는 엘리먼트를 추려낼 때 유용
var value = [10, 20, 30, 40];
var fn = function(el, index, all){
return el > 15;
};
var result = value.filter(fn);
log(result);
// [20, 30, 40]
forEach()처럼 시맨틱 접근
파라미터: 콜백 함수, this로 참조할 오브젝트
배열의 엘리먼트를 하나씩 읽어가면서
var value = [10, 20, 30];
var fn = function(el, index, all){
return el + this.add;
};
var point = {add: 100};
var result = value.map(fn, point);
log(result);
[110, 120, 130]
forEach()처럼 시맨틱 접근
배열 끝까지 콜백 함수 호출
콜백 함수만 작성한 경우
처음 콜백 함수를 호출할 때
두 번째로 콜백 함수를 호출할 때
var value = [1, 3, 5, 7];
var fn = function(prev, curr, index, all){
log(prev + "," + curr); // 4번이 아닌 3번 반복한 것은 처음 시작 인덱스가 1
return prev + curr;
};
var result = value.reduce(fn);
log("결과:", result);
// 1,3
// 4,5
// 9,7
// 결과:16
두 번째 파라미터를 작성한 경우
처음 콜백 함수를 호출할 때
두 번째로 콜백 함수를 호출할 때
var value = [1, 3, 5];
var fn = function(prev, curr, index, all){
log(prev + "," + curr);
return prev + curr;
};
var result = value.reduce(fn, 7); // 처음 콜백 함수 호출할 때 prev에 7 설정
log("반환:", result);
// 7,1
// 8,3
// 11,5
// 반환:16
reduce()와 처리 방법 같음
배열 끝에서 앞으로 하나씩 읽어가면서
var value = [1, 3, 5, 7];
var fn = function(prev, curr, index, all){
log(prev + "," + curr);
return prev + curr;
};
var result = value.reduceRight(fn);
log("반환:", result);
// 7,5
// 12,3
// 15,1
// 반환:16