
var, let, const 키워드를 사용. 하지만 var는 ES6 이후 권장하지 않음.const는 단 한 번만 할당 가능한 변수로 재선언, 재할당 모두 불가능 상수(constant)라 한다.var 키워드 대표적인 문제점undefined 초기값으로 할당되어 진다.var 호이스팅 문제란?호이스팅은 소스코드가 순차적으로 실행되는 런타임 이전 단계에서 선언문이 동작되는 것 의미.
console.log(score); // undefined
var score;
var, let, const, function, funtion*, class 키워드를 사용시 모두 런타임 이전 단계에서 먼저 실행(호이스팅) 된다. 다만, 위 소스코드 처럼 console.log(score) 실행되는 시점에는 아직 var score 선언되기 이전이므로 참조 에러가 발생되는게 정상이지만, var 경우 undefined가 출력이 되는 문제로 개발 과정에서 혼란이 가중된다.
var 블록 스코프 문제란?예를 들어 아래 for문 안 블록 스코프 벗어나 변수가 참조되는지 여부로 let과 다르게 var는 for문 안이든 밖이든 문제없이 i에 접근하여 값을 출력한다.
letfor (let i = 0; i < 10; i++) {}
console.log(i); // i is not defined
varfor (var i = 0; i < 10; i++) {}
console.log(i); // 10
const)읽기만 가능한 즉 변경할 수 없는 변수값을 지정하는 것으로 크게 3가지에 장점을 가지고 있다.
const result = 10;
result = 100; // Type Error
{}로 둘러싸인 부분을 말한다.{
let name = "ellie";
console.log(name); // ellie
}
console.log(name); // 아무값도 출력되지 않는다.
let name = "ellie";
{
console.log(name); // ellie
}
console.log(name); // ellie
변수(variable)가 메모리에 저장되는 방식은 원시(primitive) 타입과 또는 객체(object) 타입 두 가지로 구분한다.
| 구분 | 데이터 타입 | 설명 |
|---|---|---|
| 숫자 타입 | 숫자. 정수와 실수 구분 없이 하나의 숫자 타입만 존재 | |
| 문자열 타입 | 문자열 | |
| 원시 타입 | undifined 타입 | var 키워드로 선언된 변수에 암묵적으로 할당되는 값 |
| (primitive type) | null 타입 | 값이 없다는 것을 의도적으로 명시할 때 사용하는 값 |
| 심볼 타입 | ES6에서 추가된 7번째 타입 | |
| 객체 타입 (object Type) | 객체, 함수, 배열 등 |
object가 가르키는 참조(reference)가 메모리에 저장됩니다.양의 number 타입을 0으로 나누거나, 음의 number 타입을 0으로 나눌때 결과
const infinity = 1 / 0;
console.log(infinity); // Iinfinity
const negativeInfinity = -1 / 0;
console.log(negativeInfinity); // -Iinfinity
숫자가 아닌 것을 number와 연산을 했을 경우
const num = 2 * 2;
console.log(`${typeof num} : ${num}`); // number : 4
const nAn = "string" * 2;
console.log(`${typeof nAn} : ${nAn}`); // number : NaN
+ 연산자 없이 문자열 연결 연산자로 동작된다.console.log("1 + 2 = " + (1 + 2)); // 1 + 2 = 3
console.log(`1 + 2 = ${1 + 2}`); // 1 + 2 = 3
일반 문자열에서는 줄바꿈 넣으면 토큰(token)에러가 발생된다. 개행이 필요한 경우 이스케이프 시퀀스(escape sequence)를 사용하거나, 템플릿 리터럴 표기법으로 표현해야된다.
var string = 'Hellog
World'
console.log(string);
// Invalid or unexpected token
var string = `<p>Hello
World</p>`;
Hello
World
var string = "<p>Hello \n World</p>";
Hello
World
표현식을 삽입하려면 ${}으로 표현식을 감싼다. 표현식 결과는 문자열이 아니더라도 문자열로 취급된다.
var first = "ji-hun";
var last = "jang";
console.log(`My name is ${first} ${last}.`); // My name is ji-hun jang.
불리언 타입(boolean type)의 값은 논리적 참(true), 거짓(false)뿐이다.
false = 0, null, undefined, NaN, ''true = false를 제외한 모든 값연산자를 이용하여 어떤 조건이 참(true)인지 거짓(false)인지를 나타내기 위해 사용된다.
1 > 2; // false
true && false; // false
자세한 내용 : https://helloworldjavascript.net/pages/150-boolean.html
nullnull은 변수에 값이 없다는 것을 의도적으로 명시 할 때 사용Null 반환한다.var foo = null;
console.log(foo); // null
console.log(Boolean(foo)); // false
var element = document.querySelector(".myClass"); // .myClass란 노드는 없는 상태임
console.log(element); // null
undefinedundefined를 직역하면 "정의되지 않은"이다.var가 선언은 되어 있지만 값이 지정되지 않은 상태임var foo;
console.log(foo); // undefined
console.log(Boolean(foo)); // false
undefined는 자바스크립트 엔진이 변수를 초기화 할 때 사용하는 값으로 개발자가 의도적으로 변수에 undefined를 할당하는 것은 본래 취지에 어긋난다. 변수가 없다는 것을 명시하고자 하는 경우 null 할당하는 것이 정확하다.
C, Java에 정적 타입 언어로 경우 변수를 선언할때 데이터 타입을 사전에 선언한다.
char str // string
int num // number
자바스크립트는 변수를 선언할 때 타입을 선언하지 않으며, 값이 할당하는 시점 변수의 타입이 동적으로 결정되고 변수의 타입은 언제든지 자유롭게 변경(재할당)할 수 있다.
그래서 자바스크립트는 동적 타입 언어라 한다.
var foo = "Hello";
console.log(`typeof ${foo}`); // string
foo = 3;
console.log(`typeof ${foo}`); // number
암묵적 타입 변환 같은 문제로 동적 타입 언어는 유연성은 높지만, 신뢰성은 떨어지므로 다음과 같은 사항을 주의하자.