배열이 담고 있는 아이템중 특정위치에 있는 아이템을 얻고 싶을때는 인덱스 연산자를 사용합니다.
const numbers :number[] =[1, 2, 3, 4, 5]
for(let index = 0; index < numbers.length; index++){
const item:number = numbers[index]
console.log(item)
}
배열의 비구조화 할당문에서는 객체와 달리 [] 기호를 사용합니다.
const array:number[] =[1, 2, 3, 4, 5]
let [first, second, third, ...rest]= array
console.log(first, second, third, ...rest)
for ...in문은 객체를 대상으로 사용합니다.
for in문은 배열의 인덱스값을 순회합니다.
for(변수 in 객체){
...
}
ex
let names = ["Jack", "doyoon", "junsung"]
for (const index in names){
const name = names[index]
console.log(`${index}: ${name}`)
}
for ...in문은 배열의 인덱스값을 대상으로 순회하지만, for ...of문은 배열의 아이템값을 대상으로 순회합니다. 다음코드는 for ...of구문의 예로, 아이템값만 필요할 때는 for ...in보다 좀 더 간결하게 구현할 수 있습니다.
for(let 변수 of 객체){
...
}
ex
for (const name of ["Jack", "doyoon", "junsung"]){
console.log(name)
}
배열을 다루는 함수를 작성할때는 number[]과 같이 타입이 고정된 함수를 만들기 보다는 T[]형태로 배열의 아이템 타입을 한꺼번에 표현하는 것이 편리합니다. 타입을 T와 같은 일종의 변수로 취급하는 것을 제네릭 타입이라고 합니다.
const arrayLength = (array: T[]):number => array.length
이렇게 하면 컴파일러가 T의 의미를 알 수 있어야 합니다.
(T가 타입변수라고 알려줘야 한다는 뜻)
arrayLength.ts
export const arrayLength = <T>(array:T[]): number => array.length
export const isEmpt = <T>(array:T[]):boolean => arrayLength<T>(array) == 0
arrayLength-test.ts
import { arrayLength, isEmpt } from "./05/arrayLength";
let numArray:number[] = [1, 2, 3]
let strArray: string[] = ["Hello", "World"]
type IPerson = {name: string, age?: number}
let personArray: IPerson[] = [{name:"doyoon"},{name:"Junsung", age:23}, {name:"seokwon", age:23}]
console.log(
arrayLength(numArray),
arrayLength(strArray),
arrayLength(personArray),
isEmpt([]),
isEmpt([1])
)
제네릭 형태로 구현된 함수는 원칙적으로 타입변수를 다음과 같은 형태로 명시 해주어야 합니다.
함수이름<타입변수>(매개변수)
ex
const identity = <T>(n: T): T => n
console.log(
identity<boolean>(true),
identity(true)
)
...을 전개연산자라고 하였고 배열에도 적용할 수 있습니다.
let array1: number[] = [1]
let array2: number[] = [1, 2]
let mergedArrat:number[] = [...array1, ...array2, 5]
console.log(mergedArrat)
