var
, let
, const
를 이용해 선언
var a;
let b;
const c;
var a,b,c;
let num1= 1, num2= 2, num3= 3;
기존에 선언된 변수의 값을 덮어쓰며, 함수 스코프를 기준으로 동작한다.
var a = 1;
if(isSomething) {
var a = 2;
}
console.log(a) // 2
다른 코드에 영향을 주거나 버그가 발생할 때 원인을 찾기 어려움
특정 함수 내에서 var로 선언한 변수는 함수 스코프를 가진다. (함수 안에서만 접근 가능) 하지만 블록을 종종 무시해 문제가 되기도 한다.
function foo() {
for(var i=0;i<10;i+=1) {
// ...
}
console.log(i) // 10;
}
foo();
i
는 블록 내에서 선언되었지만 함수 스코프를 가지기 때문에 foo() 함수의 실행이 종료되기 전까지만 접근할 수 있다.
재선언을 허용하지 않으며, 블록 스코프(변수를 둘러싼 블록 안에서만 해당 변수에 접근 할 수 있다.)를 가진다.
예상치 못하게 기존 변수의 값이 바뀌는 위험 없이 안정적으로 변수를 사용할 수 있다.
function foo() {
for(let i=0;i<10;i+=1) {
// ...
console.log(i)
}
console.log(i); // error
}
foo();
반복문이 수행될 때마다 지역 변수로서 새로 선언되어 반복문 내에서 안전하게 값을 사용할 수 있다.
let
은 대입한 값을 계속 수정할 수 있지만 const
는 한번 대입하면 다른 값 대입을 할 수 없고 초기화 시 값이 필요하다.
const a = 0;
a = 1; // error
let b = 0;
b = 1; // 1
const c; // error
자바스크립트의 값은 원시 타입(Primitive Type)과 객체(참조형)으로 나뉜다.
원시 타입은 7가지가 있다.
원시 타입은 하나의 값만 가지며, 불변 데이터이기 때문에 연산을 해도 기존 값이 변경되지 않는다.
const result = 'hello' + 'javascript'
원시 타입을 제외한 나머지는 모두 객체다.
Not a Number. 숫자로 변환할 수 없는 값을 숫자로 변환하려고 하거나 산술 연산읜 결과가 숫자가 아니면 NaN 값이 반환됨
NaN
은 자기 자신과도 동등하지 않으므로 isNaN
을 사용하여 판별하는 것이 권장
const a = 3 - 'a';
console.log(a===a) //false
console.log(Number.isNaN(a)) // true
자바스크립트는 부동 소수점의 배정밀도를 이용해 근삿값으로 소수점 연산을 수행한다. 배정밀도는 정확한 값을 표현할 수 없어 아래와 같은 문제가 발생한다.
0.1 + 0.2 === 0.3 //false
Number.EPSLION
을 사용해 해결할 수 있다.
null : 변수를 선언하고 빈 값을 할당한 상태 (값을 없음을 나타내는 타입)
undefined: 변수를 선언하고 값을 할당하지 않은 상태
let v;
funtion f() {}
console.log(v); // undefined
console.log(f()) // undefined
typeof null // 'object'
typeof undefined // 'undefined'
null === undefined // false
null == undefined // true
null === null // true
null == null // true
!null // true
isNaN(1 + null) // false
isNaN(1 + undefined) // true
이름(키): 값 형태로 여러 값을 포함하는 컨테이너
컨테이너 내부의 값은 변경할 수 있다.
Object 생성자 함수 사용
const obj = new Object();
//프로퍼티 생성
obj.id = 'id';
obj.name = 'name';
객체 리터럴
const obj = {
id,
name,
}
생성자 함수
특정한 형태의 객체를 생성하거나 상속 받고 싶을 때 생성자 함수를 사용한다.
function Vehicle(type) {
this.type = type;
}
const car = new Vehicle('Car');
obj.name;
const prop = 'name';
obj[prop];
객체에 존재하지 않는 프로퍼티일 경우 undefined 값을 반환한다.
어떤 프로퍼티에 직접 접근 하는 게 아니라 동적인 계산이 필요하거나 프로퍼티 값이 변경될 때마다 별도의 처리 코드가 필요하다면 접근자 프로퍼티를 사용할 수 있다.
get/set 문법을 사용해 정의한다.
const obj = {
myName: 'javascript',
set name(name){
if(name !== null) {
this.myName = name;
}
},
get name(){
return this.myName;
}
set count(count) {
if (count !== null && count > 0) {
this.count = count;
}
}
}
정적 메서드를 이용해 접근자 프로퍼티를 생성할 수도 있다. 직접 새로운 프로퍼티를 정의하거나 이미 존재하는 프로퍼티를 수정한 후 그 객체를 반환한다.
const obj = {myName: 'javscript'};
Object.defineProperty(obj, 'name', {
set(name) {
if(name !== null) {
this.myName = name;
}
},
get() {
return this.myName;
}
});
// 대상이 되는 객체,
// 추가 또는 갱신하려는 프로퍼티 명이나 심볼,
// 프로퍼티 서술자를 정의한 객체 (get, set 외에 다른 것도 있음)