자바스크립트 기본 정리(ES5)

1차 카테고리
JS
2차 카테고리
기본
생성 일시
2025/02/05 04:34
최종 편집 일시
2025/02/09 16:04
발행여부
published

1. 기본 문법

1-1. 문

JS 코드 최소 실행 단위
문은 여러 개의 토큰으로 구성된다.
토큰이란 문법적으로 더 이상 나눌 수 없는 코드의 기본 요소
const sum = 1 + 2; // 토큰으로 나누면 "const", "sum", "=", "1", "+", "2"
JavaScript
복사

1-2. 표현식

값으로 평가될 수 있는 문.
과 개념이 헷갈릴 수 있는데, 표현식이 아닌 문은 값으로 할당할 수 없다.
var x; // 값을 반환하지 않으므로 문이다. 1 + 2 // 숫자 리터럴이 값으로 평가되는 표현식 x = 1 + 2; // 값을 반환하므로 표현식이자 문이다. var foo = var x; // 표현식이 아닌 문은 값처럼 사용할 수 없다.
JavaScript
복사

1-3. 변수

하나의 값을 저장하기 위해 확보한 메모리 공간 또는 메모리 공간을 식별하기 위해 붙인 이름
변수 이름을 식별자라고도 한다.

1-4. 정수, 실수, 숫자처리

자바스크립트에서는 정수, 실수 구분이 없다.(ES6부터 정수, 실수 구분 추가)
1, 1., 1.0 모두 1.0으로 간주한다. 단 표시는 1로 됨
부동 소수점은 정확도에서 문제가 발생한다.
console.log(0.1 + 0.3) // 0.30000000000000004 console.log(0.1 + 0.2 === 0.3); // false
JavaScript
복사
0.1, 0.2는 10진수로는 유한소수이지만 컴퓨터는 2진법을 사용하기 때문에, 부동 소수점 방식으로 2진수 변환하면 무한소수가 된다. 따라서 오차가 발생한다.
0.1 ≈ 0.1000000000000000055511151231257827021181583404541015625 0.2 ≈ 0.200000000000000011102230246251565404236316680908203125
Plain Text
복사
그래서 다음과 같은 방법으로 소수점 정확도 문제를 처리한다.
1.
정수로 변환 후 계산
2.
반올림

1-5. 데이터 타입

데이터는 타입을 가진다.
JS는 데이터를 기준으로 타입을 결정한다.
Primitive 타입: Number, String, Undefined, Null, Boolean, Symbol(ES6)
Object 타입: Object

Number

8바이트(64bit) 크기를 가진다.
NaN, Infinity, -Infinity의 특수 값을 가진다.

String

변수의 최대 문자열 길이는 25312^{53} - 1
하지만 일반적인 검색 엔진에서는 2302^{30}개로 약 10억개이다. 자바스크립트의 문자열은 string.length를 통해 길이를 반환하는데, number 타입의 정수로 관리되기 때문.
이론적인 한계와 실제 실행 가능한 한계가 다르다.

Undefined

변수는 이름과 값이 둘 다 있어야 한다.
변수에 값을 할당하지 않은 것 나타내는 시멘틱

Null

의도적으로 값을 할당한 것으로 코드는 수행했다는 것을 의미한다.
typeof 연산자를 사용하면 object 가 나온다. 설계미스로 ES6에서 Object.is()보완.

Boolean

그냥 true, false

Object

{ key : value } 이 구조를 하나의 프로퍼티라고 한다.
Object는 프로퍼티의 집합

2. 연산자

2-1. 숫자 변환

연산하기 전에 우선 숫자로 변환한다.
값 타입
변환 값
undefined
NaN
null
+0
boolean
true:1, false: 0
number
변환 전/후 같음
string
값이 숫자이면 숫자로 연산 단, 더하기(+)는 연결

2-2. 산술 연산자

+, -, /, %, * 에서 string이 숫자로 변환될 수 있는지 없는지를 생각하면 쉽다.
양쪽의 평가 결과가 하나라도 숫자가 아닐 때 → NaN
분모, 분자가 모두 0일 때 → NaN
분모가 0인 경우 → Infinity
분자가 0이면 → 0

2-3. 유니코드, UTF

유니코드

세계의 모든 문자를 통합하여 코드화
언어, 이모지 등등
0000 ~ FFFF, 10000 ~ 1FFFF 값에 문자 매핑
유니코드 관련 함수들
함수
설명
charCodeAt(index)
해당 인덱스의 UTF-16 코드 유닛을 반환 (서로게이트 페어 문제 있음)
codePointAt(index)
온전한 유니코드 코드 포인트 반환 (서로게이트 페어도 정상 지원)
String.fromCharCode(...)
주어진 UTF-16 코드 유닛을 문자로 변환 (서로게이트 페어 문제 있음)
String.fromCodePoint(...)
주어진 유니코드 코드 포인트를 문자로 변환 (서로게이트 페어 지원)

자바스크립트는 내부적으로 UTF-16을 사용

따라서 이모지 같은 경우, 아래와 같이 길이가 2가 출력이 되는 문제가 있다.
console.log("💖".length); // 2 (UTF-16 코드 유닛 개수) console.log("💖".codePointAt(0).toString(16)); // '1f496' (정상 유니코드 코드 포인트)
JavaScript
복사
이슈
원인
해결 방법
length가 실제 문자 개수와 다름
UTF-16은 서로게이트 페어 사용
Array.from() 또는 [...str] 사용
charAt()로 이모지 등의 문자 인덱싱 문제 발생
서로게이트 페어 앞부분만 반환
codePointAt()fromCodePoint() 사용
JSON 데이터 변환 시 깨짐
UTF-8과 UTF-16 간 변환 문제
TextDecoder("utf-8") 사용
btoa() 사용 시 에러 발생
btoa()는 UTF-16 처리
TextEncoder().encode()btoa() 사용
유니코드 관련 함수들

2-4. 동등, 부등, 일치, 불일치

== 연산자
값만 보고 타입은 보지 않는다.
undefined == nulltrue
=== 연산자
값과 타입을 다 비교한다.
!=,!== 도 마찬가지

3. 오브젝트(Object)

프로퍼티
{ name : value } 형태.
ES6에서는 Symbol로 name이 아닌 key로 생각해야 한다.
대문자 오브젝트(Object)는 { key: value }를 의미한다. 데이터 저장이 중점이다.

3-1. 프로퍼티 값 추출 (for-in)

오브젝트에서 프로퍼티를 열거
ES5부터는 프로퍼티가 작성된 순서대로 나열되는 것이 보장이 됨.
var foods = { pizza:'피자', burger:'버거', taco:'타코', sushi:'스시' } for (var food in foods){ console.log(food) }
JavaScript
복사

4. 빌트인 오브젝트(object)

값, 타입, 연산자, 오브젝트를 사전에 만들어 놓은 것
사전 처리를 하지 않고 즉시 사용할 수 있다.
소문자 오브젝트(object)는 데이터를 처리하는데 중점. 따라서 함수가 있다.
[(인스턴스 object) (빌트인 오브젝트 Object)]를 의미

빌트인 오브젝트 구조

오브젝트.prototype
인스턴스 생성 가능 여부
프로퍼티를 연결하는 오브젝트
오브젝트.prototype.constructor
오브젝트의 생성자
오브젝트.prototype.method
메소드 이름과 함수 작성
빌트인 오브젝트 형태
Number 오브젝트(object)
String 오브젝트(object)
다른 타입들도 빌트인 오브젝트가 존재하지만 생략.

4-1. Number 오브젝트

4-1-1. Number 인스턴스 생성, 프리미티브 값 구하기

인스턴스 생성
new 키워드는 인스턴스를 생성(원본을 복사한다는 개념으로 이해하자)
인스턴스를 생성하면 빌트인 오브젝트에서 prototype만 전달 받는다.
인스턴스에서는 __proto__로 원본 오브젝트에 접근.
var obj = new Number("123");
JavaScript
복사
프리미티브 값 구하기
프리미티브 값을 가지는 빌트인 오브젝트
Boolean, Date, Number, String
// 인스턴스를 생성하면 파라미터 값을 인스턴스의 프리미티브 값으로 설정. var obj = new Number("123"); // obj는 인스턴스의 프리미티브 값으로 평가된다. console.log(obj + 300); // 423
JavaScript
복사

4-1-3. Number 프로토타입 메소드

valueOf(): 인스턴스의 프리미티브 값을 반환
var obj = new Number("123"); console.log(obj + 300); // 423 // 인스턴스의 프리미티브 값 반환 obj.valueOf() // 423
JavaScript
복사
toString()
data를 String으로 변환. 파라미터 값은 변환할 진수(2~36)
20.. 을 입력해야 되는 이유는 부동소수점만 인식하기 때문에
var value = 20; console.log(20.toString()); // 오류 console.log(20..toString()); // '20' console.log(value.toString()); // '20' (디폴트는 10진수) console.log(value.toString(16)); // '14'
JavaScript
복사
toLocaleString()
숫자를 브라우저가 지원하는 지역화 문자로 변환.
ES6부터 파라미터에 언어 타입 사용이 가능하다.
var cost = 12345.78; console.log(12345.78.toLocaleString()); // '12,345.78' console.log(cost.toLocaleString()); // '12,345.78'
JavaScript
복사
toExponential()
숫자를 지수 표기로 변환하여 문자열로 반환
파라미터에 소수 이하 자릿수 작성(0~20)
var cost = 12345; // 지수(e+) 다음에 정수에서 소수로 변환된 자릿수 표시 console.log(cost.toExponential()); // '1.2345e+4' console.log(cost.toExponential(1)); // '1.2e+4' console.log(cost.toExponential(2)); // '1.23e+4' console.log(cost.toExponential(3)); // '1.235e+4'
JavaScript
복사
toFixed()
고정 소숫점 표기로 변환하여 문자열로 반환
파라미터에 소수 이하 자릿수 작성(0~20)
var cost = 1234.567; // 파라미터 값보다 소수 자릿수가 길면 작성한 자리수에 1을 // 더한 위치에서 반올림 console.log(cost.toFixed()); // '1235' console.log(cost.toFixed(1)); // '1234.6' console.log(cost.toFixed(2)); // '1234.57' console.log(cost.toFixed(3)); // '1234.567' // 반환 대상 자릿수보다 파라미터 값이 크면 나머지를 0으로 채워 반환 console.log(cost.toFixed(6)); // '1234.567000'
JavaScript
복사

4-2. String 오브젝트

이름
설명
new String()
인스턴스 생성
String 함수
설명
String()
문자열로 변환하여 반환
length
문자열의 문자 수 반환
fromCharCode()
유니코드를 문자열로 변환하여 반환
String.prototype
설명
valueOf()
문자열로 변환하여 반환
toString()
문자열로 변환
charAt()
인덱스 번째 문자 반환
indexOf()
일치하는 문자열 중에서 가장 작은 인덱스 반환
lastIndexOf()
일치하는 문자열 중에서 가장 큰 인덱스 반환
concat()
문자열 연결
toLowerCase()
영문 소문자 변환
toUpperCase()
영문 대문자 변환
trim()
문자열 앞 뒤 공백 제거
substring()
정규표현식 사용 String.prototype
- match() - replace() - search() - split()
… 등등
var value = "ABC"; console.log(value.length); // 3 console.log(value.valueOf()); // 'ABC'
JavaScript
복사

4-2-1. length 프로퍼티가 없다

위의 value에는 length 프로퍼티가 존재하지 않는다. 어떻게 length 값을 불러오는걸까? → 자바스크립트 엔진이 value의 타입을 확인하고, 내부적으로 인스턴스를 생성하고 프로퍼티 값을 읽어온다.
내부 슬롯 [[PrimitveValue]] 값을 보고 length 프로퍼티를 생성한다.
내부 슬롯 [[PrimitveValue]] 값의 접근은 valueOf() 로 가능하다.
length는 외부에서 사용할 수 있지만, [[PrimitveValue]] 값은 valueOf()를 사용해야 함.
var value = "ABC"; var obj = new String("ABC"); debugger;
JavaScript
복사

4-2-2. String 함수

formCharCode()
charCodeAt()과 형태가 왜 다를까?
자바스크립트 구조에 따른 문제로 [].formCharCode() 와 같이 작성하게 되면, 빌트인 Array 오브젝트로 불러오게 된다.
[109, 105, 110, 115, 111, 102, 116, 107] 형태를 함수 앞으로 보낼 수 없다 이는 빌트인 Array 오브젝트가 필요하기 때문이다. 따라서 빌트인 String 오브젝트 원본(인스턴스, prototype이 아닌)에 들어가게 되었다.
var author = 'minsoftk' var unicode = []; for (var i = 0; i < author.length; i+=1){ unicode.push(author[i].charCodeAt()) } console.log(unicode); // [109, 105, 110, 115, 111, 102, 116, 107] // ES5에 스프레드 연산자가 없지만 편의상 console.log(String.fromCharCode(...unicode)) // minsoftk
JavaScript
복사

4-2-3. String 프로토타입 메소드

trim()
문자열 앞뒤의 화이트 스페이스 삭제
toString()
data 위치의 값을 String 타입으로 변환.
그런데 String 오브젝트에서 toString()이 왜 필요할까? 굳이 문자열을 문자열로 변환..?
String 오브젝트의 toString()이 없다면 프로토타입 체인으로, Object 오브젝트의 toString()을 호출. 그러면 데이터 타입이 Object이기 때문에 프로퍼티 형태로 출력을 한다. 문자열을 Object 형태로 출력하는 것을 막아주기 위해서이다. → String, Number 오브젝트에서 toString()의 오버라이딩 수행
var obj = String; var instance = new String("minsoftk"); var oneProto = instance.__proto__; var oneString = oneProto.toString; var twoProto = instance.__proto__.__proto__; var twoString = oneProto.toString;
JavaScript
복사
charAt()
인덱스의 문자를 반환
문자열 길이보다 인덱스가 크면 빈 문자열을 반환
존재하지 않으면 undefined를 반환
var blog = 'blog.minsoftk.com'; console.log(blog.charAt(0)); // 'b' console.log(blog.charAt(2)); // 'o' console.log(blog.charAt(4)); // '.' console.log(blog.charAt(6)); // 'i' console.log(blog.charAt(100)); // ''
JavaScript
복사
indexOf()
data 위치의 문자열에서 파라미터의 문자와 같은 첫 번째 인덱스를 반환
왼쪽에서 오른쪽으로 검색
두 번째 파라미터를 작성하면 작성한 인덱스부터 검색
두 번째 파라미터가 NaN면 처음부터 검색
같은 문자가 없으면 -1 반환
var blog = 'blog2.minsoftk.com'; console.log(blog.indexOf('b')); // 0 console.log(blog.indexOf('o')); // 2 console.log(blog.indexOf('o', 4)); // 9 console.log(blog.indexOf('o', 20)); // -1 console.log(blog.indexOf('z')); // -1 console.log(blog.indexOf(2)); // 4
JavaScript
복사
lastIndexOf()
뒤에서 앞으로 검색
두 번째 파라미터가 0보다 작으면 -1 반환
var blog = 'blog2.minsoftk.com'; console.log(blog.lastIndexOf('b')); // 0 console.log(blog.lastIndexOf('o')); // 16 console.log(blog.lastIndexOf('o', 4)); // 2 console.log(blog.lastIndexOf('o', 20)); // 16 console.log(blog.lastIndexOf('z')); // -1 console.log(blog.lastIndexOf(2)); // 4 // 두번째 파라미터가 0보다 작음 console.log(blog.lastIndexOf('o', -1)); // -1
JavaScript
복사

4-2-4. 문자열 연결, 대소문자 변환

concat()
data 위치의 값에 파라미터 값을 작성 순서로 연결하여 문자열로 반환
String 인스턴스를 작성하면 프리미티브 값을 연결
var domain = 'minsoftk.com'; var subPrefix = 'blog'; console.log('blog.'.concat(domain)); // blog.minsoftk.com console.log(subPrefix.concat('.', domain)); // blog.minsoftk.com
JavaScript
복사

4-2-5. 문자열 추출 관련

substring()
파라미터의 시작 인덱스부터 끝 인덱스 직전까지 반환
두 번째 파라미터를 작성하지 않으면 반환 대상의 끝까지 반환
var blog = 'blog.minsoftk.com'; console.log(blog.substring(5)); // minsoftk.com console.log(blog.substring(0, 4)); // blog console.log(blog.substring(5, 13)); // minsoftk
JavaScript
복사
slice()
파라미터의 시작 인덱스부터 끝 인덱스 직전까지 반환
첫 번째 파라미터 값을 작성하지 않거나 NaN이면 0으로 간주
두 번째 파라미터 작성하지 않으면 length 사용.
값이 음수면 length에 더해서 사용

4-3. Object 오브젝트

이름
설명
new Object()
파라미터 데이터 타입의 인스턴스 생성
Object()
Object 인스턴스 생성
Object.prototype
설명
constructor
생성자
valueOf()
프리미티브 값 반환
hasOwnProperty()
프로퍼티 소유 여부 반환
propertyIsEnumerable()
프로퍼티 열거 여부 반환
isPrototypeOf()
prototype 존재 여부 반환
toString()
문자열 반환
toLocaleString()
지역화 문자열로 변환

4-3-1. 오브젝트와 인스턴스

오브젝트: new 연산자를 사용하지 않고 빌트인 오브젝트로 만든 오브젝트를 지칭.
var abc = new Object(); // 인스턴스 var obj = {}; // 오브젝트
JavaScript
복사

4-3-2. Object 인스턴스 생성, 프리미티브 값 구하기

인스턴스 생성
파라미터의 데이터 타입에 따라 생성할 인스턴스 결정
Object 오브젝트는 프리미티브 값을 가지지 않는다. 따라서 인스턴스를 생성한다.
반면에 String은 new 키워드 여부 따라 각각 인스턴스, 값으로 생성이 된다.
const newObj1 = new Object(100) const newObj2 = new Object('100') const newObj3 = new Object(null) const newObj4 = new Object(undefined) const newObj5 = new Object({ blog:'blog.minsoftk.com'}) console.log(newObj1) // [Number: 100] console.log(newObj2) // [String: 100] console.log(newObj3) // {} console.log(newObj4) // {} console.log(newObj5) // { blog: 'blog.minsoftk.com' }
JavaScript
복사
const newObj5 = Object({ blog:'blog.minsoftk.com'}) const newObj6 = new Object({ blog:'blog.minsoftk.com'}) const newObj7 = String("minsoftk"); const newObj8 = new String("minsoftk"); console.log(newObj5 instanceof Object) // true console.log(newObj6 instanceof Object) // true // new 키워드에 따라서 인스턴스 여부가 결정된다. console.log(newObj7 instanceof String) // false console.log(newObj8 instanceof String) // true
JavaScript
복사
// 오브젝트는 모두 인스턴스로 생성이 된다. var obj1 = { blog: 'blog.minsoftk.com' }; var obj2 = Object({ blog: 'blog.minsoftk.com' }); var obj3 = new Object({ blog: 'blog.minsoftk.com' }); console.log(obj1 instanceof Object); // true console.log(obj2 instanceof Object); // true console.log(obj3 instanceof Object); // true
JavaScript
복사
프리미티브 값 구하기
var obj1 = { blog: 'blog.minsoftk.com' }; console.log(obj); // { blog: 'blog.minsoftk.com' }
JavaScript
복사

4-3-3. 함수와 메소드 연결

ES6에서는 스태틱 메소드가 나왔다. ES5에서는 함수와 메소드 2가지로만 구분.(ES6에서는 3가지로 구분)
함수
오브젝트에 연결한다
Object.create()
메소드
오브젝트의 prototype에 연결
Object.prototype.toString()

4-3-4. 프로퍼티 처리 메소드

hasOwnProperty()
인스턴스에 파라미터 이름이 존재하면 true 반환.
인스턴스에 파라미터 이름이 존재하지 않으면 false.
자신이 만든 것이 아니라 상속 받은 프로퍼티면 false 반환.
빌트인 Object 오브젝트의 프로퍼티는 체크할 수 없다.
var obj = { blog: 'blog.minsoftk.com'} console.log(obj.hasOwnProperty('blog')) // true
JavaScript
복사
propertyIsEnumerable()
오브젝트에서 프로퍼티를 열거할 수 있으면 true.
오브젝트에서 프로퍼티를 열거할 수 없으면 false.
var food = { country: { korea:'한국', japan:'일본', china:'중국' }}; console.log(food.propertyIsEnumerable('country')) // true Object.defineProperty(food, 'country', { enumerable: false, }) console.log(food.propertyIsEnumerable('country')) // false
JavaScript
복사
var food = { country:{ korea:'한국', japan:'일본', china:'중국' }, food: { pizza:'피자', hotdog: '핫도그', ramen:'라멘' } }; console.log(food.propertyIsEnumerable('country')) // true console.log(food.propertyIsEnumerable('food')) // true Object.defineProperties(food, { country: { enumerable: false, }, }) console.log(food.propertyIsEnumerable('country')) // false console.log(food.propertyIsEnumerable('food')) // true
JavaScript
복사
isPrototypeOf
파라미터에 작성한 오브젝트의 prototype이 존재하면 true
파라미터에 작성한 오브젝트의 prototype이 존재하면 false
var numObj = new Number(123); // Object.prototype이 numObj에 존재하는가? console.log(Object.prototype.isPrototypeOf(numObj));
JavaScript
복사

4-4. Function 오브젝트

4-4-1. 함수 선언문, 함수 표현식

함수 선언문: 함수 이름을 생성한 function 오브젝트의 이름으로 사용.
함수 표현식: function 오브젝트를 생성하여 변수에 할당. 변수 이름이 function 오브젝트 이름이 됨.

4-4-2. 함수 호출

call()
var value = { one: 10, two: 20 }; function getTotal(){ return this.one + this.two; } var result = getTotal.call(value); console.log(result) // 30
JavaScript
복사
var value = { one: 10, two: 20 }; function getTotal(one, two){ return one + two; } var result2 = getTotal.call(this, 10, 20); console.log(result) // 30
JavaScript
복사
apply()
파라미터 수가 유동적일 때 사용
두 번째 파라미터에 배열 사용
var value = { one: 10, two: 20 }; function getTotal(){ return this.one + this.two; } var result = getTotal.apply(value); console.log(result) // 30
JavaScript
복사
var value = { one: 10, two: 20 }; function getTotal2(one, two){ return one + two; } var result2 = getTotal2.apply(this, [10, 20, 40]); console.log(result2); // 30
JavaScript
복사

4-4-3. Argument

Function 오브젝트는 아니지만 함수가 호출되어 JS 엔진이 함수 안으로 이동했을 때, arguments 이름으로 생성되는 오브젝트
function getTotal(){ var sum = 0; for (let i = 0; i < arguments.length; i+=1) { sum += arguments[i]; } return sum; } // 유동적으로 값을 입력받는 경우 var result = getTotal.apply(this, [10, 20, 40]); console.log(result); // 70
JavaScript
복사

4-5. Global 오브젝트

모든 <script>를 통해 하나만 존재한다.
new 연산자로 인스턴스 생성 불가
모든 코드에서 공유
이름은 있지만 오브젝트 실체가 없다. 오브젝트를 작성할 수 없다.
전역 객체라고 부르기도 하지만 Global은 오브젝트의 이름이다.
설명
NaN
Not a Number
Infinity
무한대 값
undefined
undefined
함수
설명
isNaN()
NaN 여부
parseInt()
무한대 값
parseFloat()
undefined
eval()
문자열을 JS 코드로 간주하여 실행 (보안성 문제로 사용하지 않는다.)
encodeURI()
URI 인코딩
encodeURICompoent()
URI 확장 인코딩
decodeURI()
encodeURI 함수의 인코딩 값을 디코딩
decodeURIComponent()
encodeURIComponent 함수의 인코딩 값을 디코딩
undefined는 값이지만 나머지는 값이 아니다. 그럼 undefined가 프로퍼티 key라는 이야기인데 오브젝트 이름이 없다. (Global.undefined) 이처럼 글로벌 오브젝트는 실체가 없다.
JS 엔진이 프로퍼티가 없으면 글로벌 프로퍼티로 간주한다.
console.log(NaN); console.log(Infinity); console.log(undefined);
JavaScript
복사

4-5-1. 자바스크립트의 오브젝트

빌트인 오브젝트
사전에 만들어 놓은 오브젝트
네이티브 오브젝트
자바스크립트 스펙에 정의한 오브젝트(빌트인 오브젝트 포함)
JS 코드를 실행할 때 만드는 오브젝트
Argument 오브젝트
호스트 오브젝트
빌트인, 네이티브 오브젝트를 제외한 오브젝트
Window, DOM 오브젝트
JS는 호스트 환경에서 브라우저의 모든 요소 기술을 연결하고 융합하여 이를 제어한다.
ex)DOM 이벤트 핸들러 등록 등등

4-5-2. Global과 Window 관계

글로벌 오브젝트는 JS가 주체
Window 오브젝트는 Window가 주체
→ 주체는 다르지만 글로벌 오브젝트의 프로퍼티와 함수가 window 오브젝트에 설정된다.
ES2020 이후로는 globalThis 표준 글로벌 오브젝트를 가르킨다.
console.log(globalThis); // 브라우저: window, Node.js: global
Scss
복사
브라우저 환경의 호스트 오브젝트: window, document, console, XMLHttpRequest
Node.js 환경의 호스트 오브젝트: process, require, fs, Buffer
즉, 브라우저에서는 window가 호스트 오브젝트 역할을 하며, 동시에 글로벌 오브젝트로 동작.

4-5-3. 정수, 실수 변환 함수

값을 정수로 변환하여 반환
값이 ‘123AB’ 일 경우 123 반환
console.log(Number('1A')) // NaN console.log(parseInt('1A')) // 1 console.log(Number('0012')) // 12 console.log(parseInt('0012')) // 12 console.log(Number(' 12')) // 12 console.log(parseInt(' 12')) // 12 // 진수 변환: 왼쪽의 값을 오른쪽의 진수로 10진수로 계산한 값 console.log(parseInt("1111", 2)); // 15 console.log(parseInt("11", 8)); // 9 console.log(parseInt(' 15', 10)) // 15 console.log(parseInt(' F', 16)) // 15
JavaScript
복사

4-5-4. NaN, 유한대 체크 함수

isNaN()
NaN끼리 비교할 때는 Object.is(NaN, NaN)을 사용
isFinite()
값이 Infinity, NaN이면 false 반환

4-5-5. 인코딩, 디코딩

encodeURI()
인코딩 제외 문자를 제외하고 %16진수%16진수 형태로 변환
제외 문자: 영문자, 숫자, #, ;, ?, :, @ 등등 특수기호들
AJAX가 없기 전에 사용된 방법
encodeURIComponent()는 제외 문자가 endcodeURI()보다 적다.
const uri = 'https://blog.minsoftk.com/?post=한글123abc'; const encoded = encodeURI(uri); console.log(encoded); // "https://blog.minsoftk.com/?post=%ED%95%9C%EA%B8%80123abc" try { console.log(decodeURI(encoded)); // "https://blog.minsoftk.com/?post=한글123abc" } catch (e) { // Catches a malformed URI console.error(e); }
JavaScript
복사

4-6. Array 오브젝트(ES3)

Array도 object이므로 Array(), new Array() 둘 다 인스턴스를 생성한다.
Array.prototype
설명
constructor
생성자
unshift()
배열 처음에 엘리먼트 삽입
push()
배열 끝에 엘리먼트 삽입
concat()
배열 끝에 값을 연결
slice()
인덱스 범위의 엘리먼트 복사
join()
엘리먼트들과 분리자를 결합하여 반환
toString()
엘리먼트를 문자열로 연결하여 반환
toLocaleString()
엘리먼트를 지역화 문자로 변환하고 문자열로 연결하여 반환
shift()
첫 번째 엘리먼트를 삭제하고 삭제한 엘리먼트 반환
pop()
마지막 엘리먼트 삭게 후, 삭제한 엘리먼트 반환
splice()
엘리먼트 삭제하고 새로운 엘리먼트 삽입, 삭제한 엘리먼트 반환
sort()
엘리먼트 값을 Unicode 순서로 분류하여 반환
reverse()
엘리먼트 위치를 역순으로 바꾸어 반환

얕은 복사 깊은 복사

slice()는 얇은 복사
최신 브라우저에서 제공하는 깊은 복사 Global 함수 structuredClone(). JSON으로 깊은 복사를 하는 방법보다 빠르다.

4-7. Array 오브젝트(ES5)

isArray()typeof를 사용했을 때 object로 밖에 확인이 되지 않기 때문에 나왔다.
Array 함수
설명
isArray()
배열 여부 반환
Array.prototype
설명
indexOf()
지정한 값에 일치하는 엘리먼트 첫 번째 인덱스 반환
lastIndexOf()
indexOf()와 같으며, 마지막 인덱스 반환
forEach()
배열을 반복하면서 콜백 함수 실행
every()
반환 값이 false일 때까지 콜백 함수 실행
some()
반환 값이 true일 때까지 콜백 함수 실행
filter()
콜백 함수에서 true를 반환한 엘리먼트 반환
map()
콜백 함수에서 반환한 값을 새로운 배열로 반환
reduce()
콜백 함수의 반환 값을 파라미터 값으로 사용
reduceRight()
reduce()와 같음. 단, 배열의 끝에서 앞으로 진행
forEach()
콜백의 3번째 인자는 모든 배열 전체가 전달된다.
forEach의 3번째 인자로 this로 참조할 오브젝트 전달이 가능
var list = ['a','b','c','d','e','f','g','h','i']; list.forEach(function (el, index, all){ console.log("🚀 ~ el, index, all:", el, index, all) });
JavaScript
복사
var list = ['some','obj','some obj']; var fn = function (el, index, all){ if (el === this.obj) console.log(el, "matched!") else console.log(el, ' not matched') } list.forEach(fn, { obj:"some obj"});
JavaScript
복사
함수 호출 시간 측정
console.time(label), console.timeEnd(label)로 측정
reduce()
두 번째 파라미터로 초기값 설정
reduceRight()는 마지막 인덱스부터
var value = [1, 2, 3, 4, 5, 6]; var fn = function (prev, cur, index, all) { console.log(prev, ',', cur); return prev + cur; }; var result = value.reduce(fn); console.log(result); // 초기값 설정 var result = value.reduce(fn, 10); console.log(result);
JavaScript
복사

5. 자바스크립트 특징

스크립팅 언어(인터프리터)
사용하는 시점에 컴파일하고 실행한다.

5-1. 객체 지향

자바스크립트는 객체 지향 언어
자바스크립트의 OOP(Object Oriented Programming)는 다른 언어의 OOP랑은 차이가 있다. 따라서 비교하는 것은 의미가 없다.
객체란? 속성과 동작을 묶은 논리적 단위를 의미한다.

5-1-1. OOP의 객체

객체는 개념적 접근으로 실체가 없다. Java, C++에서는 개념적인 설계도(클래스)를 기반으로 만들어진 인스턴스가 객체이다. 하지만 자바스크립트에서는 객체가 클래스 없이도 직접 존재할 수 있다.
Object: 자바스크립트에서 이름(키)과 값을 구성된 프로퍼티의 집합.

5-1-2. JS 객체 형태

Object 오브젝트 형태
인스턴스를 생성할 수 없음. 위에서 new 키워드나 Object 함수를 쓰면 인스턴스가 생성이 된다고 했다. 이미 인스턴스가 생성이 된 상태라 인스턴스를 생성할 수 없다.
var blog = { post: "Javascript" }
JavaScript
복사
Function 오브젝트 형태
객체지만, OOP의 객체라고 하기에는 부족하다. 객체에 오직 하나의 메소드가 하나 있는 모습이기 때문이다.
function readBlogPost(post){ ... return ... };
JavaScript
복사

5-1-3. prototype

JS의 OOP 구현 방법이다.
prototype에 메소드 연결을 한다.
다른 언어는 class 안에 메소드와 프로퍼티를 작성하지만, 자바스크립트는 prototype에 메소드를 연결하여 작성한다.
ES6에서 class로 메소드를 작성하지만, 내부에서 prototype에 연결한다.

5-1-4. 자바스크립트 인스턴스

Instance
Class를 new 연산자로 생성한 것. 프로토타입으로 연결된 것이 있으면 클래스로 볼 수 있다.
인스턴스 목적
Class에 작성된 메소드 사용.
인스턴스마다 프로퍼티 값을 유지
축구 경기에서 각 팀에 적용되는 규칙은 같지만 팀마다 점수는 다르다.

6. Object 오브젝트(ES5)

6-1. ES5 Object 특징

ES5 Object에 함수가 추가됨.
추가된 메소드(Object.prototype)는 하나도 없다.
빌트인 Object 모든 메소드(6개)는 대부분의 빌트인 오브젝트(Number, String 등등 오브젝트)에 첨부. 빌트인으로 오브젝트를 생성하므로 연결이 많이 발생하는 문제 때문에 메소드가 아닌 함수로 추가된 것 같다.
Object 함수(ES5)
설명
defineProperty()
프로퍼티 추가, 프로퍼티 속성 변경
다수의 프로퍼티 추가, 속성 변경
getPrototypeOf()
prototype에 연결된 프로퍼티 변환
getOwnPropertyName()
프로퍼티 이름을 배열로 반환
keys()
열거 가능 프로퍼티 이름 반환
getOwnPropertyDescriptor()
디스크립터 속성 반환
preventExtensions()
프로퍼티 추가 금지 설정
isExtensible()
프로퍼티 추가 금지 여부 반환
seal()
프로퍼티 추가, 삭제 금지 설정
isSeal()
프로퍼티 추가, 삭제 금지 여부 반환
freeze()
프로퍼티 추가, 삭제/변경 금지 설정
isFrozen()
프로퍼티 추가, 삭제/변경 금지 여부 반환

6-2. 프로퍼티 디스크립터

데이터 : value, writable
액세스: get, set
데이터와 액세스는 같이 작성을 할 수 없다.
데이터와 액세스는 같이 작성을 할 수 없다. 먼저 value, writeable 체크
작성되어 있으면 데이터 프로퍼티 디스크립터
작성되어 있지 않으면 액세스 프로퍼티 디스크립터
프로퍼티 디스크립터
설명
value
[[Value]], 설정할 값
writable
[[Writable]], 값 변경 가능 여부
get
[[Get]], 값 반환 프로퍼티 함수
set
[[Set]], 값 설정 프로퍼티 함수
enumerable
[[Enumerable]], 프로퍼티 열거 가능 여부
configurable
[[Configurable]], 프로퍼티 삭제 가능 여부
defineProperty()
프로퍼티마다 상태를 갖고 있음
상태란? 변경/삭제/열거 가능 여부.
상태가 가능일 때만 처리할 수 있음.

6-3. get 속성

obj.food에서 값을 호출하는데 오브젝트의 프로퍼티 중 food에 해당하는 값이 없다. 이 경우에는 get 함수가 호출된다.(set 함수도 마찬가지)
ES6에는 더 편하게 작성할 수 있도록 만들어짐.
var obj = {}; Object.defineProperty(obj, 'food', { get: function () { return 'Pizza'; }, }); var result = obj.food; console.log(result); // 'Pizza'
JavaScript
복사

6-4. 프로퍼티 추출

getPrototypeOf()
setPrototypeOf() → ES6에 있음
getOwnPropertyNames()
열거 가능 여부를 체크하지 않음.
keys()
열거 가능 여부를 체크

6-5. JSON 오브젝트

JSON 주요기능
데이터 송수신의 변환 기준
텍스트이므로 전송 속도가 빠름
기존에 쓰던 XML은 오브젝트라 무겁다.
파일 확장자: json, txt도 사용 가능
특정 조건 처리가 가능
var data = { food: { pizza: 300, burger: 12000, ice_cream: 1500, }, music: { country: 'USA', genre: 'pop', album: 'Thriller', }, }; function replace(key, value) { if (key === 'pizza' && value < 1000) { return 34000; } return value; } // replace로 var result = JSON.stringify(data, replace); console.log(result);
JavaScript
복사
var result = JSON.stringify(data, ['food']);
프로퍼티 이름이 food인 것만 직렬화를 한다.
세번째 프로퍼티에 넣는 문자 값에 따라서 들여쓰기, 줄바꿈도 가능하다.

7. Date 오브젝트

Date 함수
설명
Date()
현재 시각 반환
Date.parse()
문자열 값을 밀리초로 변환
Date.UTC()
UTC 기준 밀리초로 변환
Date.now()
현재 시각을 밀리초로 반환
Date.prototype
설명
constructor
생성자
toString()
일자와 시간을 변환해서 문자열로 반환
Fri Feb 07 2025 23:45:24 GMT+0900 (대한민국 표준시)
toUTCString()
UTC 일자와 시간 반환
Fri, 07 Feb 2025 14:45:56 GMT
toISOString()
ISO 8601 확장 형식의 간소화 버전
2025-02-07T14:46:22.945Z
toDateString()
연월일과 요일을 사람이 읽기 쉬운 형태로 반환
Fri Feb 07 2025
toTimeString()
시분초와 타임존을 사람이 읽기 쉬운 형태로 반환
23:46:49 GMT+0900 (대한민국 표준시)
toLocaleString()
일자와 시간을 지역 언어로 반환
2025. 2. 7. 오후 11:48:10
toLocaleDateString()
연월일을 지역 언어로 반환
2025. 2. 7.
toLocaleTimeString()
시분초와 오전/오후를 지역 언어로 반환
toJSON()
JSON.stringify()와 연동하여 JSON 형태의 일자, 시간 설정
2025-02-07T14:48:57.586Z