변수란? : 값을 담기 위한 공간 입니다.
// 옛날 방식 (ES6 이전)
var name = "junho";
// 요즘 방식 (ES6 이후)
let name = "junho";
const name = "junho";
var 는 이제 사용을 하지 맙시다. 추후 설명하겠지만, 일단 사용하지 마세요.
let 은 재할당이 필요한 경우 사용합니다. 위의 예시에서 name이 "junho" 가 아니라 "hojun"로 바꿀 일이 있다면, let을 사용하시면 됩니다.
const 는 바꿀 일이 없을 때 사용합니다. 일단 const로 모두 선언하고 재할당할 때 let으로 바꾸는 것도 하나의 방법입니다. (feat 코딩앙마의 tip)
변수명은 숫자로 시작할 수 없고, 변수명에는 공백,기호, 마침표 등이 들어갈 수 없습니다. 또한 예약어도 사용할 수 없습니다. 이는 개발을 진행하면서 적응할 내용이라 추가 설명은 없습니다.
다만, 가장 중요한 점은 변수 이름을 선택할 때 변수명만 읽고도 변수를 이해할 수 있도록 작성하는 것이 가장 중요합니다.
자바스크립트는 동적 언어 입니다. 즉, 정적 언어와 달리 변수를 정의할 때 자료형을 정의할 필요가 없습니다.
위에서 변수를 선언한 예시를 보았다면 바로 이해할 수 있을 것 입니다. 변수를 선언할 때 해당 변수의 type(자료형)을 정의하지 않습니다. 이를 해결하기 위해 요즘은 강타입언어(typescript)를 사용하는 추세입니다.
자바스크립트는 총 7개의 자료형이 있습니다. 이는 다시 6개의 원시 자료형과 객체로 나눠집니다.
원시 자료형(primitive)은 객체가 아닌 자료형입니다. 즉 이를 제외하면 모두 객체입니다. 특징으로는 메서드를 갖지 않습니다.
객체는 여러 속성의 모음을 저장하는 데 사용합니다. 예시 객체 입니다.
const car = {
// number 받을 수 있죠.
wheels : 4,
// string도 같이 받을 수 있죠.
color : "red"
// 함수도 할 수 있어요, 이것이 메서드가 되는 겁니다.
drive : function() {
console.log("부릉 부릉")
}
}
car.drive()
// 부릉부릉
const car = new Object();
const car = {};
두 번째 방법을 더 많이 사용합니다. (객체 리터럴)
const car = {
wheels : 4,
color : "red"
drive : function() {
console.log("부릉 부릉")
}
}
console.log(car.wheels);
console.log(car['color']);
점표기법이 쉽고 간결하지만 대괄호 표기법을 사용해야할 때도 있습니다.
원시자료형은 그냥 복사하면되는데, 객체는 참조 방식이 사용됩니다.
https://velog.io/@yunjunhojj/Deep-Dive-JS-2일차-ch11 나의 글 참고
결국 Object.assign()을 사용하는 방법이 있습니다.
const car = {
color: 'red;
}
const secondCar = Object.assign({},car);
car.wheels = 4;
console.log(car);
// {color: 'red', wheels: 4}
console.log(secondCar);
// {color: 'red'}
추후에 나올 스프레드 문법으로도 복사를 많이 합니다. 편하고 가독성이 좋거등요. 하지만 이는 1 depth의 복사 입니다. 완전한 깊은 복사가 아니라는 것을 참고해주세요.
객체는 key값과 value의 쌍으로 이루어져있지만, 배열은 index값과 value의 쌍으로 이루어져있습니다. 배열의 index는 0부터 시작합니다.
const fruitBasket = ['apple','banana','orange'];
console.log(fruitBasket[0]);
// apple
console.log(fruitBasket[1]);
// banana
push, pop, unshift, shift
const str = "hello";
typeof(str);
// "string"
함수 정의
function greet(name) {
console.log("hello" + name);
}
greet("준호");
// hello 준호
첫 괄호 (name)에서 name을 매개변수(parameter)라고 부릅니다. {}안의 코드는 명령문 (statement)라고 부릅니다.
매개변수가 객체일 경우에는 참조형으로 들어가기 때문에 주의해야합니다.
함수를 선언하는 방법은 : 함수 정의 이외에 함수 표현식, 익명 함수, 화살표 함수 등이 있습니다. 화살표 함수가 가장 중요하기 때문에 추후에 따로 정리해볼 것을 추천
const greeter = (name) => {
console.log("화살표 함수 예시" + name);
}
스코프는 자바스크립트에서 꼭 이해해야하는 부분입니다.
this 또한 몰라서는 안될 중요한 개념입니다.
변수의 스코프란 변수에 접근할 수 있는 위치를 말합니다. 크게 두 가지가 있습니다.
var myInt = 1;
if(myInt === 1){
let mySecondInt = 2;
console.log(mySecondInt);
// 블록 내부니까 2라고 콘솔 찍힘
}
console.log(mySecondInt);
// 블록 외부니까 오류를 뱉어냅니다. not defined
this의 값을 함수가 호출되는 방식에 따라 다릅니다.
여기서 호출되는 방식이라는 것이 중요합니다.
(전역에서 접근하면 -> window)
console.log(this);
// window
// window
(this는 함수를 호출한 객체이다.)
function foo() {
console.log(this);
}
const obj = {
list : [1,2,3],
foo
}
foo();
// window -> why? : window.foo()랑 같기 때문에
// use strict 모드일 경우 -> undefined 출력
obj.foo();
// obj -> obj의 다른 속성에 접근할 때 유용합니다.
// 간단하게 생각하면 . 바로 왼쪽에 있는 것을 생각하면 됩니다.
const obj = {
name: "junho"
showName{
setTimeout(()=> {
console.log(this.name)
}, 1000)
},
}
obj.showName(); // junho
// 상위 스코프 = showName의 스코프, 그것의 this = obj
this가 호출에 따라 바뀌지 않음, this를 외부에서 가져옴
화살표 함수의 this는 상위 실행 스코프 문맥의 this와 같습니다.
button.addEventListener('click', function(event){
console.log(event.target === this)
// true
})
const myCar = {
color: 'red',
logColor: function() {
console.log(this.color)
}
}
const unboundGetcColor = myCar.logColor;
console.log(unboundGetcColor());
// undefined -> this는 window가 됩니다.
const boundGetcColor = unboundGetcColor.bind(myCar);
console.log(boundGetcColor());
// red -> this를 myCar로 수동 설정 해줬습니다.
추가적인 방법