==
를 알아 보자==
는 비슷한것 같으면 true 값을 줘버린다.1 == '1' // true
'' == 0 // true
[] == '' // true ·····
===
는 어떤가1 === '1' // false
'' === 0 // false
[] === '' // false ·····
var
vs let
vs const
JavaScript 의 변수는 선언 -> 초기화 -> 할당 을거쳐서 변수를 생성한다.
var
는 변수 생성단계를 무시한다.
선언없이도 사용가능, 재선언·재할당 가능, 값이 중복이되도 error가 발생하지 않음, 호이스팅이 발생, 블록스코프를 무시, 등 문제가 많다. 사용하지 않는것을 권장한다. 여러문제로 let
과 const
가 등장했다.
let
은 재할당이 가능,선언 먼저하고 나중에 할당해도된다.
let user = 'Park';
user = 'men'; // 재할당 가능
let name; // undefined <- 언제든 할당이 가능한 상태로 초기화 되었다.
const
는 재선언,할당 불가하고 선언,할당을 동시 설정해야한다.
const num = 3;
num = 5; // TypeError
const age; // Uncaught SyntaxError: Missing initializer in const declaration
// const는 선언 할당을 동시에 하지않으면 에러 발생한다.
변수는 재할당 할일이 많이 없기 때문에 안전한 const
를 사용하고,
재할당이 필요한경우 한시적으로 let
으로 변경하거나 사용하면된다.
함수에서도 호이스팅이 발생한다.
선언식이 호이스팅이 일어나고, 표현식은 호이스팅 호이스팅이 일어나지 않아(엄밀히는 일어나지 않는것처럼 보인다.) 표현식을 더 선호한다.
함수표현식
const add = function (x, y) {
return x + y
}
add(5,10); // 15
객체의 일반복사
copy 변수에 user 값을 할당하여 같은 주소를 참조하고, 어느한쪽의 값이 변경되면 원본도 변경
const user = {name:'park', age:21, live:'seoul'};
const copy = user;
copy.age = 26;
console.log(copy); // {name: 'park', age: 26, live: 'seoul'}
console.log(user); // {name: 'park', age: 26, live: 'seoul'}
깊은복사
다른 데이터 다른주소.
깊은 복사를 하려면 객체 내부에까지 ...
연산자를 활용하여 복사해야한다.
const user = {a:1, b:{c:5,d:8}};
const copy = {...user,b:{...user.b}};
user.b.c = 10;
console.log(user); // {a:1, b:{c:10,d:8}};
console.log(copy); // {a:1, b:{c:5,d:8}};
얕은복사
객체내부 값에서부터는 같은주소를 참조한다. Object.assign
메소드사용
객체 안의 첫번째 요소 다음 단계부터는 같은 주소를 참조한다.
const foo = {a:1, b:{a2:1, b2:2}};
const hoo = Object.assign({},foo);
foo.a = 10; // {a:10, b:{a2:1, b2:2}}
hoo // {a:1, b:{a2:1, b2:2}}
//객체안의 a는 다른주소를 사용한다, b는 같은주소를 참조하여 하나만 바꿔도 변경된다.
foo.b.a2 = 100; // {a:10, b:{a2:100, b2:2}}
hoo // {a:1, b:{a2:100, b2:2}}
console.log(this); // Window
this는 기본값으로는 window 이다.
함수의 상위 스코프를 결정할때 함수를 어디서 호출했는가? 동적스코프,
함수를 어디서 선언했는가? 렉시컬 스코프 lexical scope
이다.
let x = 1;
function first() {
let x = 10;
second();
}
function second() {
console.log(x);
}
first(); // 1
second();// 1
closure
는 어휘적(lexical) 환경의 조합으로 내부에서 외부 함수의 변수에게 접근할때 생성된다.
코드를 보며 이해하자
const name = '김코딩';
const age = 28;
const person = { name, age, level: 'Junior',}
console.log(person); // {name: '김코딩', age: 28, level: 'Junior'}
각각 선언을 해줬으나 person에 하나의 객체로 할당하여 출력하였다.
코드를 보며 이해하자
배열분해
const array = ['code', 'states', 'im', 'course']
const [start, ...rest] = array
console.log(start); // 'code'
console.log(rest); // ['states', 'im', 'course']
객체분해
const student = { name: '최초보', major: '물리학과' }
const { name, ...args } = student
console.log(name); // '최초보'
console.log(ars); // {major: '물리학과'}