원본 배열 앞단에 요소를 추가하고 원본 배열의 변화된 길이를 반환하는 함수. 원본 배열을 직접 변화시킨다.
const arr = [1,1,1,1]
let result = arr.unshift(1,2)
console.log(result)
// 6
console.log(arr)
// [ 1, 2, 1, 1, 1, 1 ]
자 이제 unshift 동작 원리를 생각해보며 메서드 사용하지 않고 같은 동작을 구현해봅시답.
함수의 argument 변수를 활용해서 arguments 값 뒤에 원본 배열의 요소를 더해 주고 argument 배열을 새로 반환 시켰더니 오히려 쉽게 구현됐다.
const arr = [1,1,1,1]
function unshift(arr,...args){
for(let i = 0; i < arr.length; i++){
args[args.length] = arr[i]
}
arr = args
return arr
}
const newArr = unshift(arr,1,2)
console.log(arr)
// [ 1, 1, 1, 1 ]
console.log(newArr)
// [ 1, 2, 1, 1, 1, 1 ]
기존 unshift 메서드와 똑같이 동작하도록 만들어보았는데 꽤나 애를 먹었다. for 문에서 이터레이션이 무한으로 돌아서 한참 고민했다 도대체 뭐가 문제였는지...
function unshift(arr,...args){
const from = args.length
// 여기서 10001번씩 돌면서 무한루프 돌기 시작...
for(let i = 0; i < arr.length; i++){
arr[from + i] = arr[i]
}
return arr.length
}
unshift(arr,1,2)
console.log(arr)
// RangeError: Potential infinite loop: exceeded 10001 iterations.
const arr = [1,2]
function unshift(arr, ...args) {
arr.length = arr.length + args.length;
// args의 길이만큼 돌고있다
for(let i = 0; i < args.length; i++){
arr[args.length + i] = arr[i];
arr[i] = args[i]
}
return arr.length;
}
unshift(arr, 0,0,0,0);
// 8
console.log(arr);
// [ 0, 0, 0, 0, 1, 2, undefined, undefined ]
const arr = [1,2]
function unshift(arr, ...args) {
const arrLength = arr.length
// 첫번째 반복문에서는 arr의 모든 요소들의 위치에 args 길이를 더해주고
for(let i = 0; i < arrLength; i++){
arr[args.length + i] = arr[i]
}
// 두번째 반복문에서는 args 요소들만큼 남겨둔 자리에 요소들을 할당해주었다.
for(let i = 0; i < args.length; i++){
arr[i] = args[i]
}
return arr.length;
}
unshift(arr, 0,0,0,0);
// 6
console.log(arr);
// [ 0, 0, 0, 0, 1, 2 ]