var
(ES6 이전)선언
-초기화
-할당
중 선언
과 초기화
단계가 함께 이루어진다. // TDZ(Temporal Dead Zone) >>>
console.log(a);
// <<<
var a = 5 ; // 호이스팅, [console] undefined
let
{...}
에서만 유효선언
-초기화
-할당
은 각 단계별로 처리된다. // TDZ(Temporal Dead Zone) >>>
console.log(b);
// <<<
let b = 5 ; // 호이스팅, Reference Error
호이스팅 ?
스코프 내부 어디서든 변수 선언은 최상위에 선언된 것 처럼 행동한다.
호출보다 선언이 뒤에 있더라도 끌어올 수 있다.
const
{...}
에서만 유효선언
-초기화
-할당
의 단계가 한번에 이루어진다.객체 리터럴을 일일히 만드는 것보다 생성자 함수를 생성하고 new
키워드를 통해 쉽게 객체를 만드는 것이 가능하다.
let user = { // 객체 리터럴
name : "yujin",
age : 23
}
-------------------------------------------------
// 생성자 함수
function User(name, age){ // 첫 글자는 대문자로
this.name = name;
this.age = age;
this.sayName = function(){
console.log("HI " + this.name + "!");
}
}
let user1 = new User('yujin', 23)
let user2 = new User('hojae', 25)
user1.sayName() // [console] HI yujin!
computed property
let a = 'age';
const user = {
name : 'yujin',
[a] : 23 // age : 23
}
const hello = {
[1 + 4 ] : 5,
["nice"+"to"] : "meet you"
}
console.log(hello) // [console] {5:5, niceto : "meet you" }
계산된 프로퍼티이기 때문에 대괄호 안에 변수를 넣으면 변수에 할당된 값을 가져오고, 그 외 연산자를 넣으면 연산 결과를 가져온다.
Object method
Object.assign()
: 객체 복제그냥 새로운 변수로 할당하면 레퍼런스만 넘어와서 한 객체를 다른 두 변수가 가르키게 된다.
const user = { // 객체 리터럴
name : "yujin",
age : 23
}
const newUser = Object.assign({}, user) // (초기객체, 객체명) , {}:빈 객체
Object.assign()
을 사용할 때 초기 객체와 같은 프로퍼티가 있다면 덮어씌워준다. 인자에 두개 이상의 객체를 입력하여 합치는 것도 가능하다.
Object.assign(A, B, C) // A라는 초기 객체에 B와 C 둘 다 병합
Object.keys()
: 키 배열 반환 const user = { // 객체 리터럴
name : "yujin",
age : 23
}
console.log(Object.keys(user) // [console] ["name","age"]
Object.values()
: 값 배열 반환 const user = { // 객체 리터럴
name : "yujin",
age : 23
}
console.log(Object.values(user) // [console] ["yujin",23]
Object.entries()
: 키/값 배열 반환 const user = { // 객체 리터럴
name : "yujin",
age : 23
}
console.log(Object.entries(user) // [console] [ ["name","yujin"],["age", 23] ]
Object.fromEntries()
: 키/값 배열을 객체로 변환 const arr = [
["name","yujin"],
["age", 23]
]
Object.fromEntries(arr) // 객체로 만들어줌,,
유일한 식별자를 만들 때 사용한다. 한번 만들어진 심볼은 그 이전/이후에 생성된 심볼과는 엄격(strict)하게 구분된다.
symbol('id')
등 인자로 문자열을 주어 디버깅시 식별이 편하게 하는게 좋다.
Object.getOwnPropertySymbols(객체명)
,Reflect.ownKeys(객체명)
하면 객체 내 심볼 프로퍼티 조회 가능
심볼변수명.description
---> 심볼 만들 때 정한 키 이름 조회
symbol.for()
: 전역심볼 하나의 심볼만 보장받을 수 있다. 없으면 만들고 있으면 가져온다
symbol.for()
를 통해 하나의 심볼을 생성하면 키를 통해 생성된 심볼을 공유한다.
위치 상관 없이 어디서든지 불러올 수 있다
symbol.keyfor('심볼변수명')
---> 최초 생성한 심볼의 키를 알려줌
toString()
: 숫자 -> 문자 (..)
안에 숫자 인자를 추가하면 해당 진법으로 변환하여 문자열을 추출한다.
(..)
안의 문자열에서 숫자로 된 부분을 추출해 number로 변환해준다. 이때 첫 부분이 숫자여야 하고, 문자를 만나면 그대로 반환한다. 첫 부분이 문자라면 NaN을 반환한다, 두번째 인수로 진법을 바꿀 수 있는데, 이때는 알파벳이 진수의 일종이기 때문에
NaN이 안되고 잘 바뀐다.
(..)
안에 문자열이 숫자라면 number형으로 변환해주고 아니라면 NaN을 반환한다
NaN은 자기 자신과도 똑같지 않다고 판단하고, ===,== 둘 다 false가 나온다. 오직 isNaN
으로만 확인 가능하다
Math.PI
: 원주율
Math.ceil(num)
: num을 올림
Math.floor(num)
: num을 내림
Math.round(num)
: num 을 반올림
num.toFixed(n)
: 소수 num 을 반올림하여 n째 자리까지 보여줌 (string이 되기 때문에 꼭 변환해주깅)
Math.random()
: 0~1까지 무작위 숫자 생성
Math.max/min(n1,n2,...,n)
: 괄호 안의 숫자 중 최대/최소 값을 구해줌
Math.abs(num)
: num의 절대값을 구해줌
Math.pow(n,m)
: n^m ,n의 m승을 구해줌
Math.sqrt(num)
: num의 제곱근을 구해줌
'...'
, "..."
은 비슷하다.
` ... `은 ${...}
를 통해 변수나 연산을 문자열 사이에서 보여줄 수 있다. 추가로 여러줄을 포함할 수 있고, 작성하면서 줄바꿈이 자유롭다.
str.length
: str의 길이를 알려줌
str[n]
: 문자열의 n번째에 접근, 변경은 불가능
str.toUpperCase/toLowerCase()
: str의 모든 문자를 대문자/소문자로 변경
str.indexOf('ss')
: str에서 ss가 몇번째에 있는지 첫번째 인덱스를 알려줌 없으면 -1 반환
str.slice(n,m)
: n(포함)부터 m(미포함)까지 문자열을 반환, 생략시 끝까지, 음수면 거꾸로
str.substring(n,m)
: str에서 인덱스 n과 m 사이의 문자열 반환, 숫자 뒤집어도 같은 문자열로 나옴 음수는 0으로 인식
str.substr(n,m)
: str에서 인덱스 n부터 m개의 문자열 반환
str.trim()
: 공백 제거
str.repeat(n)
: n 번 반복
문자열 비교는 아스키 코드에 따라 달라진다.
str.codePointAt(0)
: str의 아스키 코드를 알려준다.
String.fromCodePoint(n)
: 아스키코드 n에 대응되는 문자를 알려준다.
아스키 코드에 따르면 대문자보다 소문자가 더 크다.