개발 이야기/Front-end

JS 시작하기

sonoa 2023. 3. 2. 09:18
반응형

데이터 타입 확인

// getType.js
export default function getType(data) {
  return Object.prototype.toString.call(data).slice(8, -1);
}

// main.js
import getType from './getType';

console.log(getType(123));
console.log(getType(false));
console.log(getType(null));
console.log(getType({}));
console.log(getType([]));

산술, 할당 연산자 arithmetic operator

console.log(1 + 2);
console.log(5 - 8);
console.log(3 * 4);
console.log(10 / 2);
console.log(7 % 5); // 7을 5로 나눈 후 남은 수, 나머지 값

let a = 2; // 할당 연산자
console.log(a);
//a = a + 1;  재할당
a += 1;
console.log(a);
a -= 1;
console.log(a);
a *= 1;
console.log(a);
a /= 1;
console.log(a);
a %= 1;
console.log(a);

비교 comparison operator

const b = 1;
let c = 1;
console.log(b === c); // 일치 연산자 true
c = 3;
console.log(b === c); // false

function isEqual(x, y) {
  return x === y;
}

console.log(isEqual(1, 1)); // true
console.log(isEqual(2, '2')); // false

console.log(b !== c); // 불일치 연산자 true
console.log(b <= c); // 비교 연산자 true
console.log(b >= c); // false

논리 연산자 logical operator

const a = 1 === 1;
const b = 'AB' === 'AB';
const c = false;

console.log(a);
console.log(b);
console.log(c);

console.log('&&: ', a && b && c); // and  false
console.log('||: ', a || c); // or  true
console.log('!: ', !a); // not false
console.log('!:', !c); // true

삼항 연산자 ternary operator

const a = 1 < 2; // true

if (a) {
  console.log('참');
} else {
  console.log('거짓');
}
// 참

console.log(a ? '참' : '거짓'); // 참

조건문 If Else (If statement)

function random() {
  return Math.floor(Math.random() * 10);
}

const a = random();

if (a === 0) {
  console.log('a is 0');
} else if (a === 2) {
  console.log('a is 2');
} else if (a === 4) {
  console.log('a is 4');
} else {
  console.log('rest...');
}

조건문 Switch statement

switch (a) {
  case 0:
    console.log('a is 0');
    break;
  case 2:
    console.log('a is 2');
    break;
  case 4:
    console.log('a is 4');
    break;
  default:
    console.log('rest...');
}

반복문 For statement

  • for (시작조건; 종료조건; 변화조건) {}
<ul></ul>
const ulEl = document.querySelector('ul');

for (let i = 0; i < 3; i += 1) {
  const li = document.createElement('li');
  li.textContent = `List-${i + 1}`;
  ulEl.appendChild(li);
}

변수 유효 범위 Variable Scope

  • var, let, const
  • let, const: 블럭 레벨
    • const 주사용
    • 재할당이 필요할 때 let 사용
  • var: 함수 레벨 (유효 범위가 더 넓음)
    • 메모리 누수가 발생 할 수 있다
    • 사용을 권장 하지 않음

형 변환 Type conversion

  • ==: 동등연산자, 형 병환이 일어나면 값만 비교해서 의도 하지 않은 true가 나올 수 있음
  • ===: 일치연산사, 자료의 타입까지 같아야 함
  • Truthy: 참 같은 값
    • true, {}, [], 1, 2, "false", -12, "3.14" ...
  • Falsy: 거짓 같은 값
    • false, "", null, undefined, -0, 0, Nan
const a = 1;
const b = '1';

console.log(a === b); // false
console.log(a == b); // true

JS 함수

화살표 함수

  • () => {} vs function () {}
const double = function (x) {
  return x * 2;
};

console.log('double: ', double(7));

const doubleArrow = (x) => x * 2;
//const doubleArrow = x => x * 2;  () 매개변수가 1개면 생략 가능

console.log('double: ', doubleArrow(7));
  • 객체를 반환 할 시, ({name: huisu})

IIFE 즉시실행함수 Immdiately-Invoked Function Expression

const a = 7;
function double() {
  console.log(a * 2);
}

double();

// 즉시 실행 함수 (f)() ||  (f())
(function () {
  console.log(a * 2);
})();

호이스팅 Hoistiong

  • 함수 선언부가 유효범위 최상당으로 끌어올려지는 현상
const a = 7;

double(); // TypeError: double is not a function

const double = function () {
  console.log(a * 2);
}; // 함수 표현식은 실행 당시에 생성이 되기 때문에, 호이스팅이 안된다.
const a = 7;

double(); // 14

function double() {
  console.log(a * 2);
} // 함수 선언식은 바로 선언되기 때문에, 호이스팅이 가능하다

타이머 함수

  • setTimeout(함수, 시간): 일정 시간 후 함수 실행
  • setInterval(함수, 시간): 시간 간격마다 함수 실행
  • clearTimeout(): 설정된 Timeout 함수를 종료
  • clearInterval(): 설정된 Interval 함수를 종료
// 한번만
const timer = setTimeout(() => {
  console.log('huisu');
}, 3000);

const h1El = document.querySelector('h1');

h1El.addEventListener('click', () => {
  clearTimeout(timer);
});

// 계속
const timer = setInterval(() => {
  console.log('huisu');
}, 3000);

const h1El = document.querySelector('h1');

h1El.addEventListener('click', () => {
  clearInterval(timer);
});

콜백 Callback

  • 함수의 인수로 사용되는 함수
function timeout(callback) {
  setTimeout(() => {
    console.log('hello');
    callback();
  }, 3000);
}

timeout(() => {
  console.log('Done!');
});

JS 클래스

생성자 함수 prototype

const huisu = {
  firstName: 'huisu',
  lastName: 'Noh',
  getFullName: function () {
    return `${this.firstName} ${this.lastName}`;
  },
};

console.log(huisu);
console.log(huisu.getFullName());

const janghun = {
  firstName: 'janghun',
  lastName: 'Lee',
  getFullName: function () {
    return `${this.firstName} ${this.lastName}`;
  },
};

console.log(janghun.getFullName());

const hojun = {
  firstName: 'hojun',
  lastName: 'Noh',
  getFullName: function () {
    return `${this.firstName} ${this.lastName}`;
  },
};

console.log(hojun.getFullName());

// 같은 내용을 반복적으로 작성 = 비효율
function User(first, last) {
  this.firstName = first;
  this.lastName = last;
}

User.prototype.getFullName = function () {
  return `${this.firstName} ${this.lastName}`;
};

const huisu = new User('huisu', 'Noh'); // new f (): 생성자 함수
const janghun = new User('jang', 'Lee');
const hojun = new User('hojun', 'Noh');

console.log(huisu); // 인스턴스
console.log(janghun);
console.log(hojun);

console.log(huisu.getFullName());
console.log(janghun.getFullName());
console.log(hojun.getFullName());

ES6 Classes

class User {
  constructor(first, last) {
    this.firstName = first;
    this.lastName = last;
  }
  getFullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}

this

  • 일반(Normal) 함수는 호출 위치에서 따라 this 정의!

  • 화살표(Arrow) 함수는 자신이 선언된 함수 범위에서 this 정의!

  • 일반 함수를 써야 하는 예시

const huisu = {
  name: 'huisu',
  normal: function () {
    console.log(this.name);
  },
  arrow: () => {
    console.log(this.name);
  },
};

huisu.normal();
huisu.arrow(); // undefined
  • 화살표 함수를 써야 하는 예시
const timer = {
  name: 'huisu!',
  timeout: function () {
    setTimeout(function () {
      console.log(this.name);
    }, 2000);
  },
};

timer.timeout(); // undefined

const timer = {
  name: 'huisu!',
  timeout: function () {
    setTimeout(() => {
      console.log(this.name);
    }, 2000);
  },
};

timer.timeout(); // huisu!

상속 (확장)

class Vehicle {
  constructor(name, wheel) {
    this.name = name;
    this.wheel = wheel;
  }
}

const MyVehicle = new Vehicle('운송수단', 2);
console.log(MyVehicle);

// extends 확장, 상속
class Bicycle extends Vehicle {
  constructor(name, wheel) {
    super(name, wheel);
  }
}

class Car extends Vehicle {
  constructor(name, wheel, license) {
    super(name, wheel);
    this.license = license;
  }
}

console.log(new Bicycle('삼천리', 2));
console.log(new Car('기아', 4, '필요하다'));
반응형

'개발 이야기 > Front-end' 카테고리의 다른 글

React 맛보기  (0) 2023.03.04
JavaScript Level up  (0) 2023.03.03
JS 선행  (0) 2023.03.01
CSS 의 속성 2  (2) 2023.02.28
CSS 의 속성  (0) 2023.02.27