'내가 보려고 정리한 자주 사용하는 자바스크립트 내장 메서드 정리'
어떠한 기능을 구현하거나 문제를 해결해 내야할 때,
자바스크립트 내장 메서드를 활용하면 시간을 절약하는 등 많은 도움을 받을 수 있다.
적어도 내가 자주 사용했던 메서드들에 대해 리마인드하고, 활용할 수 있는 능력을 길러보자.
문제 상황에 따라 데이터의 타입 변환이 필요한 순간이 있다.
숫자타입은 산술연산이 가능하다(
+, -, *, /, %
)
문자타입은 배열과 같이 인덱스를 가지고 있으며 쪼개서 분리하거나 합칠 수 있다.
Object는 키와 값으로 이루어져 데이터를 관리하기 용이하다.
typeof
: 해당 값의 타입을 확인할 수 있다.typeof 100; // 'number'
typeof -100; // 'number'
typeof '안녕'; // 'string'
String()
: 괄호안에 값을 문자타입으로 변환하여 반환함let a = 123;
String(a) // '123'
let b = [1,2,3];
String(b) // '1,2,3' 배열을 집어넣으면 , 까지 같이 포함됨 (length변경)
.toString()
: 앞에 붙이는 객체를 문자타입으로 변환하여 반환함let a = 123;
a.toString(); //'123'
[456].toString(); //'456'
Number()
: 괄호안에 값이 문자타입 숫자라면 숫자타입으로 변환하여 반환함Number('123'); //123
Number('안녕'); //NaN
parseInt()
: 괄호안에 값이 문자타입 숫자라면 숫자타입으로 변환하여 반환함(Number()
와 같은 역할)parseInt('123'); //123
parseInt('안녕'); //NaN
Object.values()
: 괄호안에 객체를 넣으면 주어진 객체의 값들을 일반적인 반복문과 동일한 순서로 순회되는 열거할 수 있는 배열로 반환함 (객체의 값들만 합쳐서 배열로 빼냄)const object1 = {
a: 'somestring',
b: 42,
c: false
};
Object.values(object1); // ['somestring', 42, false]
Object.keys()
: 괄호안에 객체를 넣으면 주어진 객체의 이름들을 일반적인 반복문과 동일한 순서로 순회되는 열거할 수 있는 배열로 반환함 (객체의 키값들만 합쳐서 배열로 빼냄)const object1 = {
a: 'somestring',
b: 42,
c: false
};
Object.keys(object1); // ['a', 'b', 'c']
.toFixed()
: 앞에 숫자타입을 입력한 후 괄호안에 소수점 n번째 자리까지 변환할 값을 반환함(원하는 소수점자리까지 변환)let a = 123.456;
a.toFixed(0); // 123
a.toFixed(1); // 123.4
isNaN()
: 괄호 안의 값이 NaN인지 판별함(true / false로 반환됨)//특정 값이 숫자인지 판별할때 숫자라면 false가 나옴
let a = 123;
let b = '123';
let c = '가나다';
isNaN(a) //false
isNaN(b) //false 타입이 문자여도 값이 숫자라면 false가 나옴 (숫자가 맞음)
isNaN(c) //true (숫자가 아님)
Number.isInteger()
: 괄호 안의 값이 정수인지 판별함(정수라면 true, 정수가아니라면(소수점 존재) false)Number.isInteger(144) //true
Number.isInteger(144.12) //false
Math.floor()
: 괄호 안의 숫자를 내림하여 반환함Math.floor(100.621); // 100
Math.ceil()
: 괄호 안의 숫자를 올림하여 반환함Math.ceil(100.621); // 101
Math.ceil(0.1); // 1
Math.round()
: 괄호 안의 숫자를 반올림하여 반환함Math.round(100.621); // 101
Math.round(100.421); // 100
Math.abs()
: 괄호 안의 숫자의 절대값을 반환함Math.abs(-100); // 100
Math.abs(100); // 100
Math.sqrt()
: 괄호 안의 숫자의 루트값을 반환함Math.abs(4); // 2
Math.abs(2); // 1.4142135623730951
Math.pow()
: 괄호 안의 첫번째 숫자를 밑으로, 두번째 숫자를 지수인 숫자로 반환함(첫번째를 두번째 숫자로 제곱함)Math.pow(2, 5); // 32
Math.min()
: 괄호 안의 값들을 비교하여 가장 작은 값을 반환함(배열을 괄호안에 넣을땐 경계연산자 사용하기)Math.min(3,1,2) //1
Math.min('3','1','2') //1
//배열을 집어넣을땐 `...` 경계연산자를 사용한다.
let a = [4,5,6]
Math.min(...a) //4
Math.max()
: 괄호 안의 값들을 비교하여 가장 큰 값을 반환함(배열을 괄호안에 넣을땐 경계연산자 사용하기)Math.max(3,1,2) //3
Math.max('3','1','2') //3
//배열을 집어넣을땐 `...` 경계연산자를 사용한다.
let a = [4,5,6]
Math.max(...a) //6
.length
: 문자열의 길이를 반환함'안녕하세요'.length; // 5
[n]
: 문자열 뒤에 붙이면 해당 문자열의 n번째 인덱스를 반환함(문자열 인덱스는 0부터 시작)'안녕하세요'[0]; // '안'
.toLowerCase()
: 문자열을 소문자로 변경함'HELLO WORLD'.toLowerCase(); // 'hello world'
.toUpperCase()
: 문자열을 대문자로 변경함'hello world'.toUpperCase(); // 'HELLO WORLD'
.concat()
: 문자열 연결 연산자 +
처럼 문자열을 이어붙임 (앞에는 붙일 문자열을, 괄호안에는 뒤에 연이어 붙일 문자열을 넣어준다.), 배열과 배열을 이어붙이는 것도 가능하다.'hello '.concat('world'); // 'hello world'
let arr1 = ['a','b','c'];
let arr2 = [1, 2, 3];
arr1.concat(arr2) //['a', 'b', 'c', 1, 2, 3]
.slice()
: 문자열의 일부를 잘라서 반환함 (괄호안에 시작할 인덱스와 종료할 인덱스의 숫자를 넣어준다.)this.#player.upsides = this.#stairs.upside.slice(0, step + 1);
'hello world'.slice(0, 5); // 'hello'
.substring()
: 앞의 문자열을 입력한 후, 괄호 안에 시작 인덱스와 종료인덱스의 숫자를 넣어주면 문자열을 자른것처럼 반환함(종료인덱스를 넣지 않으면 시작인덱스 부터 문자열의 끝까지 반환)let a = '안녕하세요';
a.substring(0,2) // '안녕'
a.substring(2) // '하세요'
.indexOf()
: 문자열 내의 특정 문자가 몇 번째 위치하는지 인덱스 숫자로 반환함(앞에는 탐색할 문자열을 입력하고, 괄호안에는 찾을 특정문자를 입력한다. 특정문자가 없다면 -1
을 반환함/ 특정문자가 있다면 해당 문자가 몇번째 위치에 있는지 위치 인덱스를 반환함)'123'.indexOf(2); // 1
'123'.indexOf('2'); // 1
//활용 예시- 배열이나 문자열에서 특정값이 포함되어있나 찾기
if(lastStep[POSITION_SYMBOLL.UP_STREET].indexOf(MOVING.UNPASSED) > -1 ||
lastStep[POSITION_SYMBOLL.DOWN_STREET].indexOf(MOVING.UNPASSED) > -1) {
return RESULT.FAIL;
}
.split()
: 문자열을 괄호안의 문자를 기준으로 분리하여 배열로 반환함'123'.split(''); // ['1', '2', '3']
.replace()
: 괄호안에 (문자열의 범위, 교체할 문자열)을 입력하면 해당 범위의 문자열을 교체할 문자열로 변경해줌//보통 정규표현식으로 범위를 설정함
let str = 'abecidoeu'
str.replace(/[aeiou]/g, '') //a,e,i,o,u에 해당하는 문자를 빈문자열로 교체하여 새롭게 반환됨 'bcd'
str.replace(/[aeiou]/g, 'x') //'xbxcxdxxx' 문자열범위에 해당하는 모든 문자를 교체할 문자로 변경함
.repeat()
: 괄호안에 숫자를 입력하면 해당 숫자만큼 .
앞의 문자열을 반복해서 새로운 문자열을 반환함let str = 'abc'
str.repeat(3) // 'abcabcabc'
let str2 = 'z'
str2.repeat(1) //'z'
new Array()
: 괄호안에 숫자를 넣으면 인덱스를 그 숫자만큼 가진 새로운 배열을 만든다.let a = new Array(3) // [undefined, undefined, undefined]
.fill()
: 앞에 입력한 배열에 괄호안에 넣은 값 하나로 length 만큼 전부 채움(채울인덱스, 시작인덱스, 끝인덱스를 인자로 넣을 수 있음)let arr = [1, 2, 3];
arr.fill(4) // [4, 4, 4];
arr.fill(4, 0) // [4, 4, 4];
arr.fill(4, 1) // [1, 4, 4];
arr.fill(5, 0, 2) // [5,5,3];
.splice()
: 앞에 입력한 배열의 기존 요소를 삭제/ 교체/ 추가하여 변환함(시작할 인덱스, 제거할 요소의 수, 추가할 값)let arr = [1, 2, 3];
arr.splice(1, 0, 4);
console.log(arr); // [1, 4, 2, 3]
//활용 예시
if(moving === MOVING.UPSIDE_STRING) this.#stairs.downside.splice(step, 1, MOVING.BLANK);
.push()
: .
앞에 배열을 입력하면 해당 배열의 맨 마지막 인덱스 뒤에 괄호안의 값을 추가하여 변환함let a = 4;
let arr = [1,2,3];
arr.push(a) // [1, 2, 3, 4]
.pop()
: .
앞에 배열을 입력하면 해당 배열의 맨 마지막 요소를 제거하고 마지막 요소를 반환함(앞에 입력된 배열은 마지막요소가 제거된 상태로 변환됨)let arr = [1, 2, 3];
arr.pop(); // 3
arr; // [1, 2]
.join()
: 배열의 모든 요소를 연결해 하나의 문자열로 변환하여 반환함let arr = [1, 2, 3];
arr.join() // '1,2,3' (빈 괄호상태라면 배열의 `,` 까지 같이 하나의 문자로 합쳐짐)
arr.join('') //'123' (괄호안에 `''`을 넣어주면 값만 하나의 문자로 합쳐짐)
let a = 98;
arr.join(a) // '1982983' (괄호안에 특정값을 넣으면 배열의 `,` 부분이 특정값으로 변환됨)
//활용예시
this.#player.downsides.join(MOVING.JUMP);
.sort()
: .
앞에 배열을 입력하면, 해당 배열의 요소를 유니코드 순으로 재정렬하여 반환함//문자요소 재정렬시
let arr1 = ['가', '다', '나'];
arr1.sort(); // ['가', '나', '다']
//숫자요소 재정렬시 (오름차순 정렬)
let arr2 = [2, 10, 3, 0];
arr2.sort() // [0, 10, 2, 3] (두자리 이상의 수는 정렬이 정확하지 않음)
// 정확한 숫자 오름차순 정렬
let arr2 = [2, 10, 3, 0];
arr2.sort((a, b) => a - b ); // [0, 2, 3, 10] (괄호안에 콜백함수를 넣어 요소의 순서를 재정렬해야됨)
// 정확한 숫자 내림차순 정렬
let arr2 = [2, 10, 3, 0];
arr2.sort((a, b) => b - a ); // [10, 3, 2, 0]
.reverse()
: .
앞에 배열을 입력하면, 해당 배열의 요소를 역순으로 재정렬하여 반환함//문자타입 값 재정렬시
let strArr = ['가','다','나'];
strArr.reverse() // ['다', '나', '가']
//숫자타입 값 재정렬시
let numArr = [1,0,3,2];
numArr.reverse() // [3, 2, 1, 0]
//배열에 다양한 문자가 있을때 reverse 사용 예시
let arr = ['a', 'A', 0, 3, '!', 'B', 'z']
arr.reverse() //['!', 3, 0, 'A', 'a']
//reverse를 사용했을땐 출력값이 요구되는 순서와 모두 일치하는지 주의가 필요하다.
let arr = ['a', 'A', 0, 3, '!', 'B', 'z']
arr.reverse() //['z', 'B', '!', 3, 0, 'A', 'a']
.reduce()
: .
앞에 배열을 입력하고, 괄호안에 주로 콜백함수를 넣어 배열의 전체 인덱스를 합친 값을 계산할 때 주로 사용됨let arr = [1, 2, 3];
arr.reduce((acc, v) => acc + v); // 6
.some()
: .
앞에 배열을 입력하고, 괄호안에 판별함수를 넣어 해당 배열안의 하나의 요소라도 주어진 판별함수를 통과하는지 테스트함(반환값은 ture/ false)let arr1 = [1, 2, 3];
let validate = (element) => element % 2 === 0; //짝수의 조건
arr.some(validate) // ture (짝수 2를 배열안에 포함하고 있기 때문)
let arr2 = [1, 3, 5];
arr2.some(validate) // false (배열안에 홀수만 있기 때문)
.includes()
: .
앞에 배열을 입력하고, 괄호안에 특정 값을 넣으면 해당 배열이 특정값을 포함하고 있는지 판별함(반환값은 ture/ false), 문자열에도 사용가능let arr = [1, 2, 3];
let a = 2;
let b = 4;
let c = '1';
arr.includes(a); // ture
arr.includes(b); // false
arr.includes(c); // false
let str1 = 'abc';
let str2 = 'b';
str1.includes(str2) //ture
.forEach()
: .
앞에 배열을 입력한 후, 괄호안에 콜백함수를 넣으면 해당 배열 요소 각각에 대해 실행함 (주로 for문 대신 사용하는 용도로 쓰임)let arr = [1, 2, 3];
arr.forEach((value) => console.log(value * 2)) // 2 4 6 순서대로 총3번 출력됨
//활용예시
memo[user].forEach(userFriend => {
delete memo[userFriend];
})
.map()
: .
앞의 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환함let arr = [1, 2, 3];
arr.map((value) => value * 2) // [2, 4, 6]
arr; // [1, 2, 3] 이기 때문에 map으로 새로운 배열을 반환한 값을 다른 변수에 담아서 사용해야함
//예시
let multy = arr.map((value) => value * 2);
.filter()
: .
앞에 배열을 입력한 후, 괄호안에 함수를 넣으면 주어진 함수를 통과(ture)하는 모든 요소를 모아 새로운 배열로 반환함.let arr = [1, 2, 3];
let arr2 = arr.filter((value) => value < 3);
arr2 // [1, 2]
//활용예시
let countRankFive = this.overlapList.filter((value) => value === OVERLAP_COUNT_THREE).length;
(Set의 사용은 왠만하면 지양하도록 하자)
new Set()
: Set 생성방법, 괄호안에 배열을 집어넣으면 값들로만 이루어진 객체로 반환함let x = new Set([1, 2, 3]); // {1, 2, 3}
let y = new Set("안녕") // {'안', '녕'} 괄호안에 문자열을 집어넣으면 한글자씩 잘라서 객체로 반환됨
new Set().size
: 생성된 Set객체의 길이를 반환함let x = new Set([1, 2, 3]).size // 3
.add(), .delete(), .has(), .clear()
등의 메서드가 있다.영어 소문자 a~z 는 97 ~ 122
영어 대문자 A~Z 는 65 ~ 90
공백문자 32
.charCodeAt()
: .
앞에 문자를 아스키코드 넘버로 바꿔줌. (한글자 단위), 괄호안에 숫자를 넣으면 해당 문자열 인덱스를 아스키코드 넘버로 바꿔줌let str1 = 'a';
str1.charCodeAt() //97 소문자는 97 ~ 122
let str2 = 'A';
str2.charCodeAt() //65 대문자는 65 ~ 90
let str3 = ' '; //공백
str3.charCodeAt() //32
let str4 = 'bac';
str4.charCodeAt(1) //97
//활용예시 - 배열의 값들을 전부 아스키코드로 바꿔야 할 경우
for (let i = 0; i < word.length; i++) {
askiiNum.push(word.charCodeAt(i));
}
String.fromCharCode()
: 괄호안에 아스키코드 넘버를 넣어주면 해당하는 문자로 바꿔줌String.fromCharCode(97); // 'a'
//활용예시
for (let i = 0; i < askiiNum.length; i++) {
if (askiiNum[i] >= 65 && askiiNum[i] <= 90) {
askiiStr.push(String.fromCharCode(155 - askiiNum[i]));
}
(자바스크립트에서 자바 enum 흉내내기)
상수는 값을 하드코딩 하지 않기 위해 사용한다.
문자열, 숫자 등의 값을 하드 코딩하지 않는다.
상수를 만들고 이름을 부여해 이 변수의 역할이 무엇인지 의도를 드러낸다.
Object.freeze()
: 괄호안의 객체를 동결시킴
Symbol()
: 괄호안의 값을 심벌화함
//활용예시 (주로 고정된 constants 객체에 사용하면 좋음)
const CONTROL = Object.freeze({
START: Symbol('1'),
END: Symbol('2'),
RETRY: Symbol('3')
});
대문자 스네이크 표기법
을 사용한다.// bad 예시
const firefox = 1;
const is_left = true;
// good 예시
const FIREFOX = 1;
const IS_LEFT = true;
소스의 변수명, 클래스명 등에는 영문 이외의 언어를 사용하지 않는다.
클래스, 메서드 등의 이름에는 특수 문자를 사용하지 않는다.
기능 단위로 파일이나 객체를 작게 분리했다면,
분리한 파일을 모듈화하여 연결 할 수 있어야 한다.
module.exports
: 모듈 내보내기//주로 파일 맨 마지막 줄에 작성함
module.exports = BridgeGame; //BridgeGame 이라는 클래스
//한 파일에 내보내야할 객체가 많을때
module.exports = { OUTPUT, INPUT, ERROR }; //객체로 묶어서 해당 객체이름을 각각 입력
require()
: 모듈 받아오기//주로 파일 맨 윗 줄에 작성함
const Validate = require("./Validate"); //같은폴더의 파일 전체 받아오기
const { CONTROL, ERROR } = require("./constants/Values"); //다른폴더의 파일(특정 객체만) 받아오기
const { Console } = require("@woowacourse/mission-utils"); //외부API(특정 객체만) 받아오기
//활용 예시1 모듈로 받아온 객체 호출하기
printStart() {
Console.print(`${OUTPUT.START}\n`);
}
//활용 예시2
const OutputView = require("./OutputView");
const BridgeGame = require("./BridgeGame");
const Validate = require("./Validate");
const{ CONTROL } = require("./constants/Values");
class GameController {
constructor() {
this.brideGame = new BridgeGame();
this.validate = new Validate();
}
play() {
OutputView.printStart();
}
}
입력받은 값이 프로그램에서 조건에 만족하는지 확인하고,
만약 조건에 맞지 않는 값이라면, 상황에 따라 오류를 발생시킬 수 있다.
node.js에서 오류가 발생하면 프로그램은 자동 종료되지만,
오류를 발생시킨 후 재실행하도록 만드는 방법이 존재한다.
.bind(this)
: 새로운 함수를 생성, 받게되는 첫 인자의 value로는 this 키워드를 설정하고, 이어지는 인자들은 바인드된 함수의 인수에 제공됨.
try {} catch(error) {}
: try 문 안에는 오류를 판별할 메서드를 호출, catch 문 안에는 오류발생시 계속 실행될 메서드를 호출
throw new Error()
: 오류를 발생시킴, 괄호안에는 오류가 실행될 때 사용할 메세지를 넣음
//활용예시 - 입력값을 try/catch문으로 전달
requestBridgeSize() {
InputView.readBridgeSize(this.tryBuildBridge.bind(this));
}
//try/catch문에서 오류 발생 시 재실행 될 수 있도록 만듬
tryBuildBridge(size) {
try {
this.validate.validateBridgeSize(size);
this.brideGame.ready(size);
this.requestMoving();
} catch(error) {
this.retryRequestBridgeSize();
}
}
//조건에 맞지 않다면 오류 발생시키도록 구현한 메서드
validateCommand(command) {
if(command !== RETRY.REPLAY && command !== RETRY.END) throw new Error(ERROR.INPUT_RETRY);
}
class 클래스명 { 필드 constructor( ) { } 메서드( ) { } }
#변수
: 필드에 변수 선언시 변수앞에 #
을 붙여 private class 필드로 구현한다.//활용예시
class BridgeGame {
#stairs;
#player;
#count;
constructor() {
this.#stairs = { bridge: [] };
this.#player = { step: [], upsides: [], downsides: [] };
this.#count = 1;
}
ready(size) {
const bridgeInformation = makeBridge(Number(size), generate);
this.#stairs.bridge = bridgeInformation;
this.addBridgeCondition();
}
}
https://developer.mozilla.org/ko/docs/Web/JavaScript
https://minhanpark.github.io/today-i-learned/javascript-set/
https://github.com/airbnb/javascript