data type
원시타입 (single item)
: 변경 불가능한 값. 값에 의한 전달.number
string
let str = 'string';
str[0] = 'S';
console.log(str); // string
* 재할당은 가능!
let str = 'string';
str = 'String';
console.log(str); // 기존 문자열 변경이 아닌 새로운 문자열을 새롭게 할당
boolean
null
undefined
symbol
고유 식별자가 필요할 때
우선순위를 주고 싶을 때
<동일한 string이나 다른 심볼>
const symbol1=symbol('id');
const symbol2=symbol('id');
console.log(symbol1===symbol2) // false
<동일한 string이고 동일한 심볼을 만들고 싶을 때>
const symbol1=symbol.for('id');
const symbol2=symbol.for('id');
console.log(symbol1===symbol2) // true
<symbol 출력 방법 .description!>
console.log(`hi, ${symbol1.description}`);
객체 타입 (box container)
const seri = {name: 'seri', age: 9};
seri.age = 5; // (const임에도 변경 가능)
let vs var
const 사용 이유
const vs let
대부분의 변수는 const로 선언. 변경될 여지가 있는 변수만 let을 이용
변수의 이름
|| / &&
==
===
타입, 값이 같으면 true
주의
<object equality>
const apple1 = {name: 'apple'};
const apple2 = {name: 'apple'};
const apple3 = apple1;
console.log(apple1 == apple2); // false (ref가 다름)
console.log(apple1 === apple2); // false (ref가 다름)
console.log(apple1 === apple3); // true(ref가 같음)
console.log(0 == false); // T
console.log(0 === false); // F (0은 불리언 타입이 아님)
console.log('' == false); // T
console.log('' === false); // F
console.log(null == undefined); // T
console.log(null === undefined); // F
function square(number) {
return number * number
}
square.x = 10;
square.y = 20;
console.log(square.x, square.y); // 10 , 20
자바스크립트 함수는 일급 객체
함수 표현식 (function expression)
const print = function () {
console.log('print');
};
print(); // print
const printAgain = print;
printAgain(); // print
call by value (premitive parameters)
call by reference (object parameters)
function changeVal(primitive, obj) {
primitive += 100;
obj.name = 'Kim';
obj.gender = 'female';
}
var num = 100;
var obj = {
name: 'Lee',
gender: 'male'
};
changeVal(num, obj);
console.log(num);
console.log(obj); // {name: 'Kim', gender: 'female'}
call by value
방식인 num은 그대로
100.
call by reference
방식인 obj는 값이 바뀐
걸 확인할 수 있다.
Callback 함수
function randomQuiz(answer, printYes, printNo) {
if (answer === 'love you'){
printYes();
} else {
printNo();
}
}
const printYes = function () {
console.log('yes');
}
const printNo = function () {
console.log('no');
}
randomQuiz('wrong', printYes, printNo);
randomQuiz('love you', printYes, printNo);
// expression
const add = function (a,b) {
return a+b;
};
// arrow function
const add = (a,b) => a + b;
// 인수가 하나라면 괄호 생략 가능
let sayHello = name => `Hello, ${name}`;
// 길어질 때는 {}를 써도 됨 그러나 return을 써줘야 한다
Const add = (a,b) => {
// do something more
return a * b;
};
function showMessage(message, from){
console.log(`${message} by ${from}`);
}
showMessage('hi!');
// hi! by undefined
function showMessage(message, from = 'unknown'){
console.log(`${message} by ${from}`);
}
showMessage('hi!');
// hi! by unknown
// BAD CASE
function upgradeUser(user) {
if (user.point > 10) {
// long upgrade logic...
}
}
// GOOD CASE
function upgradeUser(user) {
if (user.point <= 10) {
return;
}
// long upgrade logic...
}
같은 집단에 속하는 속성과 행위를 정의한 것
template
declare once
no data in
object
instance of a class
created many times
data in
클래스 선언
class Person {
// constructor : 인스턴스를 생성 및 초기화하기 위한 메서드
constructor(name, age) {
// fiels
this.name = name;
this.age = age;
}
// methods
speack() {
console.log(`${this.name}: hello!`);
}
}
// 새로운 오브젝트를 만들 때 new를 씀
const seri = new Person('seri', 3);
console.log(seri.name);
console.log(seri.age);
seri.speack();
// 필드: firstName, lastName, _age
class User {
constructor(firstName, lastName, age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
// get은 값을 리턴
get age() {
return this._age;
}
// set은 값을 설정하기 때문에 value를 받아와야 함
set age(value) {
this._age = value < 0 ? 0 : value;
}
}
const user1 = new User('steve', 'Job', 5)
console.log(user1.age);
class Shape {
constructor(width, height, color) {
this.width = width;
this.height = height;
this.color = color;
}
draw() {
console.log(`drawing ${this.color} color of`);
}
getArea() {
return this.width * this.height;
}
}
// extends! Shape에서 정의한 fields와 methods가
자동적으로 Rectangle에 포함됨
class Rectangle extends Shape {}
//overwriting
class Triangle extends Shape {
draw() {
super.draw(); // 부모의 draw를 호출
console.log('△');
// overwriting한 draw 함수에서만 출력하게 됨
}
}
const rectangle = new Rectangle(20, 20, 'blue');
rectangle.draw();
console.log(rectangle.getArea());
const triangle = new Triangle(20,20,'red');
triangle.draw();
console.log(triangle.getArea());
// class checking: instanceOf
// 왼쪽의 object가 오른쪽의 class를 통해 만들어진 것인지 체크하는 것
console.log(rectangle instanceof Rectangle); // t
console.log(triangle instanceof Rectangle); //f
console.log(triangle instanceof Triangle); //t
console.log(triangle instanceof Shape); //t
console.log(triangle instanceof Object); //t
// 자바스크립트에서 만든 모든 오브젝트, 클래스는
자바스크립트의 오브젝트를 상속한 것이다.
,
로 구분1. 오브젝트 만드는 방법 두 가지
1. object literal
const obj1 = {};
2. object constructor / 클래스를 이용해서 만드는 방법
const obj2 = new Object
2. 출력 함수
function print(person) {
console.log(person.name);
console.log(person.age);
}
const seri = { name: 'seri', age: 4 };
print(seri);
3. 뒤늦게 하나의 property 추가, 삭제 가능
(에러 발생하게 할 수 있음. 지양)
<추가>
seri.hasJob = true;
console.log(seri.hasJob);
<삭제>
delete seri.hasJob;
console.log(seri.hasJob); // undefined
4. object 접근 방법 두 가지
console.log(seri.name);
// 그 키에 해당하는 값을 가져오고 싶을 때
console.log(seri['name']);
// 정확하게 어떤 키가 필요한지 모를 때 runtime에서 결정될 때 이렇게 씀
// .name을 쓰는게 맞다 실시간으로 원하는 키의 값을 가져오고 싶을 땐 []
function printValue(obj, key) {
console.log(obj[key]); // obj.key는 오류
}
printValue(seri, 'name'); // key는 항상 string 타입으로 전달
5. in operator: property existence check (key in obj)
console.log('name' in seri);
console.log('age' in seri);
6. for (key in obj)
for (key in seri) {
console.log(key);
}
7. for of
const array = [1, 2, 4, 5];
for(value of array) {
console.log(value);
}
8. object.assign
const user4 = {};
Object.assign(user4, user);
console.log(user4);
9. 추가, 삭제
car.color = 'black';
car['wheels'] = 4;
delete car.color;
10. 단축 프로퍼티
const apple = {
name, // name: name과 동일
color : 'red',
eat(){
console.log('상큼')
}
}