var → 변수 재선언 가능, 선언 전에 변수 사용도 가능, 함수 스코프
let, const → 블록 스코프
하지만 var는 현재 권장되지 않음
선언 단계초기화 단계할당 단계 → var는 선언 단계와 초기화 단계가 동시에 진행됨
→ const는 선언 + 초기화 + 할당이 동시에 진행됨
스코프 내부 어디서든 변수 선언부의 코드가 최상단에 있는 것처럼 작동하는 것
var를 사용한 변수의 경우 호이스팅됨 ! let, const도 호이스팅은 되지만 TDZ의 영향으로 오류 발생
초기화, 할당은 호이스팅 되지 않아 undefined로 표시됨
console.log(name)
var name = "Jane";
코드를 예측 가능하게 하고, 잠재적인 문제를 줄여줌
Object.assign({}, 원본 객체1, 원본2...) → 객체 복제, 병합 const cloneUser = user;는 참조 값 복사 … 똑같은 걸 두 개 만들려면 assign() 사용해야 함 !!Object.keys() → 객체 key 배열 반환Object.values() → 객체 value 배열 반환Object.entries() → 객체 key / value 쌍 배열 반환Object.fromEntries() → key / value 쌍 배열을 객체로 변환property key는 문자형으로 사용됨 → 숫자, bool로 작성해둬도 문자로 접근
심볼은 유일한 식별자를 만들 때 사용함 ! log 직으면 다 Symbol()로 뜨지만 내용물은 다름
**const key = Symbol(설명);** 으로 생성 후 프로퍼티 key로 사용
→ 원본 객체 수정 없이 새로운 속성 추가 가능 ( keys()에 보이지 않음 … )
key.**description**으로 매개변수로 사용했던 설명 확인 가능Object.**getOwnPropertySymbols**(key); → 존재하는 symbol 키 리스트 출력Reflect.**ownKeys**(key); → symbol 키를 포함한 모든 key 리스트const key = **Symbol.for**(이름);으로 전역 Symbol 공유 가능toString(진수)으로 진법 변환 가능 !
Math.round(값 * 10^자릿수)/10^자릿수 공식 사용 num.**toFixed**(자릿수); 함수 사용 → 문자열임에 유의 !! NaN( Not a Number )을 확인하는 유일한 방법!
NaN != NaN 이므로 ==으로 확인 불가능함 …
Number()와 달리 읽을 수 있는 부분까지 숫자로 변환해줌 !!
소수점이 있을 경우 소수점 아래는 무시
parseFloat()도 parseInt()와 동일하게 동작, 부동소수점 반환
문자열의 비교는 ASCII 코드를 기준으로 진행됨
"a".codePointAt(0); // 97
String.fromCharCode(97); // "a"