문자열, arguments..등의 유사배열객체는 length속성이 있으며 어떤 것은 length속성이 readonly다.
배열은 length속성이 writable이기때문에 length=0;으로 설정하면 배열이 초기화된다.
let arr = new Array(1,2,3,4);
let arr = [1,2,3,4]; // 단축표현
shift, unshift메소드를 사용하면 배열전체의 인덱스가 조정되어 부하가 발생하기때문에 배열로 구현할지를 잘 생각해야 한다.
alert( [1,2] + 1 );
배열은 Symbol.toPrimitive속성의 메소드가 정의되어있지 않다.
숫자1과 더하기연산을 해야하므로 배열은 valueOf메소드를 호출하지만 valueOf메소드도 Array클래스에 정의되어있지 않기때문에 toString이 호출되는데 Array클래스에 toString이 정의되어있어 호출된다.
toString메소드는 배열원소들을 쉼표로 구분한 문자열을 반환한다.
따라서 '1,21'문자열이 출력된다.
delete arr[3];
원소값을 undefined로 할당할뿐 원소자체가 없어지는것이 아니다.
배열에 원소추가 , 삭제
arr.splice(index[, deleteCount, elem1, ..., elemN])
특정인덱스 원소를 삭제하면서 원소를 추가할 수 있다.
인덱스변경이 발생되어 부하가 발생한다.
음수인덱스를 사용할 수 있다.
-1은 가장끝을 가리키는 것이 아니고 마지막 원소 바로앞을 가리킨다.
let arr = [1, 2, 5];
arr.splice(-1, 0, 3, 4); // [1,2,3,4,5]
array.slice([start], [end]);
array.concat([value1[, value2[, ...[, valueN]]]])
let arr = [1, 2, 3];
let obj = {
0:4,
length:1
};
console.log( arr.concat(obj) ); // [1, 2, 3, {…}]
숫자인덱스를 가진 객체를 concat메소드에 사용했을때 배열로 추가되지 않는다.
let arr = [1, 2, 3];
let obj = {
0:4,
[Symbol.isConcatSpreadable]: true,
length:1
};
console.log( arr.concat(obj) ); // [1, 2, 3, 4]
Array.from(obj);로 객체를 배열로 만든후 concat해도 되지만 보다 최적화를 위해 위와 같이 Symbol.isConcatSpreadable속성을 사용하면 유사배열객체를 배열에 추가할 수 있다.