dash-case(kebab-case)
< HTML, CSS >
ex) the-quick-brown-fox-jumps-over-the-lazy-dog
snake_case
< HTML, CSS >
ex) the_quick_brown_fox_jumps_over_the_lazy_dog
camelCase
< JS >
ex) theQuickBrownFoxJumpsOverTheLazyDog
PascalCase
< JS > -> 생성자
ex) TheQuickBrownFoxJumpsOverTheLazyDog
0 기반 번호 메기기!
특수한 경우를 제외하고 0부터 숫자를 시작한다.
예시 코드
let fruits = ["Apple", "Banana", "Cherry"];
console.log(fruits[0]); // "Apple"
console.log(fruits[1]); // "Banana"
console.log(fruits[2]); // "Cherry"
console.log(new Date("2021-01-30").getDay()); // 6, 토요일
console.log(new Date("2021-01-31").getDay()); // 0, 일요일
console.log(new Date("2021-02-01").getDay()); // 1, 월요일
0부터 시작한다!!
// 한 줄 메모
/* 한 줄 메모 */
/**
* 여러 줄
* 메모 1
* 메모 2
*/
JS는 모든 것이 데이터로 동작한다!
문자, 숫자 등 데이터로 사고하면서 학습해야 한다.
따옴표를 사용한다.
백틱을 사용하면 보간법 이용 가능 👉 변수 출력
let myName = "BADA";
let email = "example@abc.com";
let hello = `Hello ${myName}!`;
console.log(myName); // BADA
console.log(email); // example@abc.com
console.log(hello); // Hello BADA!
정수 및 부동소수점 숫자를 나타낸다.
let number = 123; // 정수
let opacity = 1.57; // 부동소수점 숫자
console.log(number); // 123
console.log(opacity); // 1.57
true, false 두 가지 값밖에 없는 논리 데이터이다.
let checked = true;
let isShow = false;
console.log(checked);
console.log(isShow);
값이 할당되지 않은 상태를 나타낸다.
let undef;
let obj = { abc: 123 };
console.log(undef); // undefined
console.log(obj.abc); // 123
console.log(obj.xyz); // undefined
어떤 값이 의도적으로 비어있음을 의미한다.
명시적이다!
let empty = null;
console.log(empty); // null
undefined와 null이 무언가가 없다, 라는 걸 나타낸다는 점에선 똑같다. 하지만, 의도적이냐 의도적이지 않냐에 따라 이 둘을 구분할 수 있다.
여러 데이터를 Key:Value 형태로 저장한다. { }
let user = {
// Key: Value
name: "BADA",
age: 23,
isValid: true,
};
console.log(user.name); // BADA
console.log(user.age); // 23
console.log(user.isValid); // true
여러 데이터를 순차적으로 저장한다. [ ]
let fruits = ["Apple", "Banana", "Cherry"];
console.log(fruits[0]); // "Apple"
console.log(fruits[1]); // "Banana"
console.log(fruits[2]); // "Cherry"
세미콜론(;
)을 붙이는 게 맞다. 하지만, 붙이지 않아도 자바스크립트가 동작하는 환경에서 자바스크립트를 해석하는 엔진이 자동으로 세미콜론을 붙여서 해석하도록 되어 있다.
데이터를 저장하고 참조(사용)하는 데이터의 이름
재사용이 가능!
변수 선언!
let a = 2;
let b = 5;
console(a + b); // 7
console(a - b); // -3
console(a * b); // 10
console(a / b); // 0.4
값(데이터)의 재할당 가능!
let x = 12; // 선언
console.log(x); // 12
x = 999; // 재할당 가능
console.log(x); // 999
값(데이터)의 재할당 불가!
const y = 12;
console.log(y);
y = 999;
console.log(y); // TypeError: Assignment to constant variable.
특별한 의미를 가지고 있어, 변수나 함수 이름 등으로 사용할 수 없는 단어
특정 동작(기능)을 수행하는 일부 코드의 집합(부분)
// 함수 선언
function helloFunc() {
// 실행 코드
console.log(1234);
}
// 함수 호출
helloFunc(); // 1234
function returnFunc() {
return 123;
}
let a = returnFunc();
console.log(a); // 123
// 함수 선언!
function sum(a, b) {
// a와 b는 매개변수(Parameters)
return a + b;
}
// 재사용!
let x = sum(1, 2); // 1과 2는 인수(Arguments)
let y = sum(7, 12);
let z = sum(2, 4);
console.log(a, b, c); // 3, 19, 6
// 기명 함수
// 함수 선언!
function hello() {
console.log("Hello~");
}
// 익명 함수
// 함수 표현!
let world = function () {
console.log("World!");
};
// 함수 호출!
hello(); // Hello~
world(); // World~
// 객체 데이터
const bboddo = {
name: "BBODDO",
age: 100,
// 메소드(Method)
getName: function () {
return this.name;
},
};
const hisName = bboddo.getName();
console.log(hisName); // BBODDO
// 혹은
console.log(bboddo.getName()); // BBODDO
조건의 결과에 따라 다른 코드를 실행하는 구문
조건이 true면 실행 false면 실행하지 않음
let isShow = true;
let checked = false;
if (isShow) {
console.log("Show!"); // Show!
}
if (checked) {
console.log("Checked!"); // Checked!
}
if (isShow) {
console.log("Show!"); // Show!
} else {
console.log("Hide?"); // Hide?
}
Document Object Model, Application Programming Interface
<script>
태그의 defer 속성 : 페이지가 모두 로드된 후에 해당 외부 스크립트가 실행됨을 명시
// HTML 요소(Element)
const boxEl = document.querySelector(".box");
// HTML 요소에 적용할 수 있는 메소드!
boxEl.addEventListener();
// 인수(Arguments) 추가 가능
boxEl.addEventListener(1, 2);
// 1 - 이벤트(Event, 상황)
boxEl.addEventListener("click", 2);
// 2 - 핸들러(Handler, 실행할 함수)
boxEl.addEventListener("click", function () {
console.log("Click~!");
});
요소의 클래스 정보 객체 활용해서 클래스 조작하기
// HTML 요소(Element) 검색/찾기
const boxEl = document.querySelector(".box");
// 요소의 클래스 정보 객체 활용!
boxEl.classList.add("active");
let isContains = boxEl.classList.contains("active");
console.log(isContains); // true
boxEl.classList.remove("active");
isContains = boxEl.classList.contains("active");
console.log(isContains); // false
이벤트 발생 시 요소의 클래스 조작
const boxEl = document.querySelector(".box");
console.log(boxEl);
boxEl.addEventListener("click", function () {
console.log("Click~!");
boxEl.classList.add("active");
console.log(boxEl.classList.contains("active"));
boxEl.classList.remove("active");
console.log(boxEl.classList.contains("active"));
});
HTML 요소 모두 검색/찾기
// HTML 요소(Element) 모두 검색/찾기
const boxEls = document.querySelectorAll(".box");
console.log(boxEls);
// 찾은 요소들에 반복해서 함수 실행(forEach)
// 익명 함수를 인수로 추가!
boxEls.forEach(function () {});
// 첫 번째 매개변수(boxEl) : 반복 중인 요소
// 두 번째 매개변수(index) : 반복 중이 번호
boxEls.forEach(function (boxEl, index) {});
// 출력
boxEls.forEach(function (boxEl, index) {
boxEl.classList.add(`order-${index + 1}`);
console.log(index, boxEl);
});
Getter & Setter
const boxEl = document.querySelector(".box");
// Getter, 값을 얻는 용도
console.log(boxEl.textContent); // Box!!
// Setter, 값을 지정하는 용도
boxEl.textContent = "BboDdo?!";
console.log(boxEl.textContent); // BboDdo?!
const a = "Hello~";
const b = a.split("").reverse().join(""); // 메소드 체이닝
console.log(a); // Hello~
console.log(b); // ~olleH
: Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임(프로그래밍 언어가 동작하는 환경!).
자바스크립트가 동작할 수 있는 환경
1. node.js가 설치되어 있는 특정 컴퓨터 환경
2. 웹 브라우저
: 전 세계의 개발자들이 만든 다양한 기능들을 관리
: 현재 프로젝트에 관한 정보와 패키지 매니저(npm, yarn)을 통해 설치한 모듈들의 의존성을 관리하는 파일이다.
npm install
명령어로 모듈들의 다운로드가 완료되면 node.modules 라는 폴더가 생성되는 것을 확인할 수 있다.package.json
에서는 버전 정보를 저장할 때 version range
를 사용한다.
version range란?
🙋♀️ : "내가 사용할 패키지의 버전은4.16.1
버전이야"라고 말하는 대신
🙋♀️ : "나는4.16.1
버전 이상, 그리고4.17.0
미만의 패키지를 사용할거야" 라고 말하는 방식을 뜻한다
협업을 하기위해 우리는 같은 package.json
을 사용해서 각자의 컴퓨터에 같은 패키지들을 설치해서 같은 개발환경을 구성하게 된다.
하지만 불행하게 이러한 일들이 일어날 수 있다.
🧑💻 : "코드가 돌아가질 않아..!"
👩💻 : "내 컴퓨터에서는 잘만 돌아가는데..?"
몇 시간 뒤...
🧑💻 : "모듈에 문제가 있는 거서 같아.. 나는4.16.1
인데, 너는 버전 몇이야?"
👩💻 : "4.16.2
"
이렇게 버전 문제 때문에 몇 시간씩 버리는 것은 모든 일에 효율을 극한으로 따지는 개발자들에게 맞지 않다.
여기서 주목해야할 점은
package-lock.json
이 존재할 때에는 npm install
의 동작 방식이 조금 변한다는 점이다! package.json
을 사용하여 node_modules
를 생성하지않고 package-lock.json
을 사용하여 node_modules
를 생성한다.
더 정확한 패키지를 내려받기 위함이다!
Parcel이란 2017년에 나온 웹 애플리케이션의 번들러이다.
Webpack의 비해서 매우 늦게 나왔지만 webpack보다 빠르고 설정이 필요 없는 부분에서 두각을 보였다. webpack을 실제로 사용해 본 사람이라면 webpack의 설정이 까다롭고 많은 시간적 비용이 드는지 알 것이다. 이런 면에서 본다면 parcel은 매력적이다.
설정이 필요없는 zero-configuration
이기 때문에다. webpack과는 다르게 Parcel은 캐싱을 하므로 최초 빌드보다는 두 번째 빌드 속도부터 불꽃 튀게 빠르다.
: Semantic Versioning
ex)
Major.Minor.Patch
4.17.21
ex)
^Major.Minor.Patch
^4.17.21
ex)
~Major.Minor.Patch
~4.17.21
const string1 = "Hello"; // 큰 따옴표
const string2 = "Hello"; // 작은 따옴표
const string3 = `Hello ${string1}`; // 백틱
백틱은 데이터를 채워넣어서 출력할 수 있다. → 템플릿 리터럴 기호
const number = 123;
const pi = 3.14;
console.log(number);
console.log(pi);
// 주의할 점
console.log(number + undefined); // NaN
console.log(typeof (number + undefined)); // number(NaN)
const a = 0.1;
const b = 0.2;
console.log(a + b); // 0.30000000000000004
console.log((a + b).toFixed(1)); // 0.3 (type: string)
console.log(Number((a + b).toFixed(1))); // 0.3 (type: number)
// Boolean (불린)
const a = true;
const b = false;
if (a) {
console.log("Hello"); // 실행
}
if (b) {
console.log("Hello!"); // 실행 안 됨
}
let age = null;
setTimeout(() => {
age = 85;
console.log(age); // 85
}, 1000);
console.log(age); // null
const user = {
name: "bada",
age: 20,
};
console.log(user.name); // bada
console.log(user.age); // 20
console.log(user.email); // undefined
// Array (배열)
// const fruits = new Array("Apple", "Banana", "Cherry");
const fruits = ["Apple", "Banana", "Cherry"];
console.log(fruits);
console.log(fruits[1]); // 인덱싱
console.log(fruits.length); // Array 길이
console.log(fruits[fruits.length - 1]); // 마지막 요소 출력
// Object (객체)
const user = new Object(); // 객체 데이터 생성
user.name = "bada";
user.age = 20;
console.log(user); // {name: 'bada', age: 20}
function User() {
this.name = "bada";
this.age = 20;
}
const user = new User();
console.log(user); // User {name: 'bada', age: 20}
리터럴 방식!
const user = {
name: "bada",
age: 20,
};
console.log(user); // User {name: 'bada', age: 20}
console.log(user.name); // bada
console.log(user.age); // 20
const userA = {
name: "bada",
age: 20,
};
const userB = {
name: "bboddo",
age: 23,
parent: userA,
};
console.log(userB);
function hello() {
console.log("Hello!");
}
hello(); // Call
console.log(hello);
호출하지 않으면 함수 데이터로 존재
function getNumber() {
return 123;
}
console.log(getNumber);
console.log(getNumber());
const a = function () {
console.log("A");
};
const b = function (c) {
console.log(c);
c();
};
b(a);
const a = 1; // Number
const b = "1"; // String
console.log(a === b); // false
console.log(a == b); // true
=== : 일치
== : 동등
if (123) {
console.log("참!"); // 출력 O
}
if (0) {
console.log("참!"); // 출력 X
}
if ("0") {
console.log("참!"); // 출력 O
}
대부분은 참에 해당. 거짓에 해당하는 데이터만 알고 있으면 된다.
// 데이터 타입 확인
const a = 123;
console.log(typeof a);
console.log(typeof "Hello" === "string");
console.log(typeof 123 === "number");
console.log(typeof false === "boolean");
console.log(typeof undefined === "undefined");
console.log(typeof null); // object
console.log(typeof []); // object
console.log(typeof {}); // object
console.log(typeof function () {} === "function");
console.log([].constructor === Array);
console.log({}.constructor === Object);
console.log(Object.prototype.toString.call(null).slice(8, -1) === "Null");
function checkType(data) {
return Object.prototype.toString.call(data).slice(8, -1);
}
console.log(checkType(null) === null);
console.log(checkType([])); // Array
console.log(checkType({})); // Object