
변수 · 연산자 · 객체 리터럴 · 함수
자바스크립트(ES6 기준)는 7개의 데이터 타입을 제공하며, 크게 원시 타입과 객체 타입으로 나뉜다
원시 타입(primitive)
numberstringbooleanundefinednullsymbol (ES6)객체 타입(object)
var integer = 10;
var double = 5.5;
var negative = -10;
자바처럼 int, double 등으로 나누지 않고 숫자 타입 하나만 존재
모든 숫자는 실수로 처리
특수한 값
Infinity (양의 무한대)-Infinity (음의 무한대)NaN (산술 연산 불가, Not-a-Number)var str1 = 'JavaScript';
var str2 = "JavaScript";
var str3 = `JavaScript`; // 백틱 (템플릿 리터럴)
템플릿 리터럴(Template Literal)
const name = '홍길동';
const msg = `안녕하세요, ${name}님!`;
${ } 안에 표현식 삽입 가능var flag = true;
flag = false;
true / false 두 값만 존재var undef;
console.log(undef); // undefined
var val = 'something';
val = null; // 의도적으로 '값 없음'을 명시
undefined
null
var key = Symbol('key'); // 유일한 값
var obj = {};
var func = function () {};
var arr = [];
symbol
object
자바스크립트는 동적 타입 언어입니다.
정적 타입 언어(C, Java 등)
int num; 처럼 변수 선언 시 타입을 명시동적 타입 언어(JavaScript, Python)
var, let, const로 선언할 때 타입을 쓰지 않음let value = 10; // number
value = 'hello'; // string
value = true; // boolean
자바스크립트는 상황에 따라 값을 다른 타입으로 자동 변환하기도 하고, 개발자가 직접 변환하기도 함
문자열로 변환
console.log(10 + '20'); // '1020'
+ 연산자는 피연산자 중 하나라도 문자열이면 문자열 연결을 시도숫자로 변환
console.log(10 - '5'); // 5
console.log(10 > '5'); // true
console.log(+''); // 0
불리언으로 변환 (Truthy / Falsy)
if (undefined) console.log('실행 X');
if (null) console.log('실행 X');
if (0) console.log('실행 X');
if (NaN) console.log('실행 X');
if ('') console.log('실행 X');
if ('JavaScript') console.log('실행 O');
false로 취급되는 값(Falsy): undefined, null, 0, NaN, '' 등true로 평가(Truthy)문자열로
String(10);
(10).toString();
10 + '';
숫자로
Number('10');
parseInt('10');
parseFloat('10.01');
+''; // 0
'10' * 1; // 10
불리언으로
Boolean('JavaScript'); // true
!!'JavaScript'; // true
console.log(1 == '1'); // true
console.log(1 == true); // true
console.log(1 === '1'); // false
console.log(1 === true); // false
== (동등 비교)
=== (일치 비교)
실무에서는 거의 항상 === 사용을 권장
console.log('apple' || 'banana'); // 'apple'
console.log('apple' && 'banana'); // 'banana'
A || B
A && B
이렇게 결과가 확정되는 순간 평가를 멈추는 것을
단축 평가(short-circuit evaluation)라고 한다.
?.var obj = null;
var val = obj?.value;
console.log(val); // undefined
null 또는 undefined면 에러 대신 undefined 반환const user = null;
console.log(user?.profile?.name); // undefined, 에러 발생 X
??var test = null ?? '기본 값';
console.log(test); // '기본 값'
null 또는 undefined일 때만 우항을 반환const input = 0;
const val = input ?? 10;
console.log(val); // 0 (0은 null/undefined가 아니므로 그대로 사용)
자바스크립트는 객체 기반 언어이고, 원시 값을 제외한 대부분이 객체
var student = {
// 프로퍼티(속성)
name: '유관순',
age: 16,
// 메서드(함수)
getInfo: function () {
return `${this.name}(은)는 ${this.age}세입니다.`;
}
};
키(key) : 값(value) 쌍var student = {
name: '유관순', // 키: name, 값: '유관순'
age: 16
};
프로퍼티 키
symbolvar dog = {
name: '뽀삐',
eat: function (food) {
console.log(`${this.name}(은)는 ${food}를 맛있게 먹어요.`);
}
};
프로퍼티 접근 방법
console.log(dog.name); // 마침표 표기법
console.log(dog['name']); // 대괄호 표기법
대괄호 표기법 사용 시
var dog = { name: '뽀삐' };
dog.name = '두부'; // 값 변경
dog.age = 3; // 프로퍼티 동적 추가
delete dog.age; // 삭제
delete 객체.프로퍼티 → 프로퍼티 삭제 (없는 키는 조용히 무시) var id = 'p-0001';
var price = 30000;
var product = { id, price };
// { id: 'p-0001', price: 30000 }
id: id → id로 축약 가능var prefix = 'key';
var index = 0;
var obj = {
[`${prefix}-${index++}`]: index,
[`${prefix}-${index++}`]: index,
[`${prefix}-${index++}`]: index
};
var dog = {
name: '두부',
eat(food) {
console.log(`${this.name}(은)는 ${food}를 맛있게 먹어요.`);
}
};
eat: function (food) { ... } → eat(food) { ... }로 축약 var student = { name: '유관순' };
console.log('name' in student); // true
console.log('height' in student); // false
in 연산자로 프로퍼티 존재 여부 확인var student = {
name: '유관순',
age: 16
};
for (var key in student) {
console.log(`${key} : ${student[key]}`);
}
for...in 반복문으로 객체의 모든 키 순회 가능function hello(name) {
return `${name}님 안녕하세요!`;
}
var hello = function (name) {
return `${name}님 안녕하세요!`;
};
// 함수 참조
console.log(hello);
console.log(hi);
// 함수 호출
console.log(hello('홍길동'));
// console.log(hi('홍길동')); // TypeError: hi is not a function
function hello(name) {
return `${name}님 안녕하세요!`;
}
var hi = function (name) {
return `${name} 안녕~`;
};
undefined → 할당 전 호출 시 오류undefinedarguments 객체에 담김return 뒤의 값을 함수 호출 결과로 반환undefined 반환var message;
// 기존 함수
message = function () {
return 'Hello World!';
};
// 화살표 함수
message = () => {
return 'Arrow Function!';
};
// 한 줄일 때는 중괄호 + return 생략 가능
message = () => 'Arrow Functions are Simple!';
// 매개변수 있는 경우
message = (val1, val2) => 'Arrow ' + val1 + val2;
// 매개변수 하나면 괄호 생략 가능
message = val => 'Arrow ' + val;
function 키워드 대신 => 사용(function () {
console.log('익명 즉시 실행 함수! 함수 정의와 동시에 호출!');
})();
function factorial(n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
function outer() {
var outerVal = '외부 함수';
function inner() {
var innerVal = '내부 함수';
console.log(outerVal, innerVal);
}
inner();
}
outer();
function increase(value) {
return value + 1;
}
function decrease(value) {
return value - 1;
}
function apply(func, value) {
return func(value); // 고차 함수가 콜백 호출
}
console.log(apply(increase, 5)); // 6
console.log(apply(decrease, 5)); // 4
map, filter 등)에서 핵심 패턴var cnt = 0;
// 순수 함수
function increase(n) {
return ++n; // 외부 상태를 변경하지 않음
}
cnt = increase(cnt);
// 비순수 함수
function decrease() {
return --cnt; // 외부 상태(cnt)를 직접 변경
}
순수 함수
비순수 함수
함수는 자바스크립트에서 일급 객체(First-class Object)
일급 객체 조건:
var hello = function () {
return '안녕하세요!';
};
var obj = { hello };
function repeat(func, count) {
for (var i = 0; i < count; i++) {
console.log(func());
}
return function () {
console.log(`${count}번 반복 완료`);
};
}
var returnFunc = repeat(obj.hello, 5);
returnFunc();