본문 바로가기

웹 프로그래밍/JavaScript

[JS] 자바스크립트 자료형 특징과 호이스팅 개념(var, let, const)

데이터 타입 종류

number

string

boolean

undefined

null

 

object

symbol

 

변수 선언 방법

자바스크립트는 느슨한 타입 (loosely typed) 언어, 동적 (dynamic) 언어다. 즉, 변수의 타입을 미리 선언 할 필요가 없고 내부적으로 자동으로 파악한다. 그리고 같은 변수에 여러 타입의 값을 넣을 수 있다. 

변수를 선언하려면 var 변수명 = 값; 형태로 작성하면 된다. 이때, var 조차 쓰지 않아도 변수가 선언된다. 엄밀히 말하면 var 선언한 것과 안 한 것의 차이는 있다. (아직 나는 잘 모름)

<script > 
	var a = 10;
	var b = "hello";
	c = 12.34;
	
	alert(typeof a); 
	alert(typeof b);
	alert(typeof c);
	
</script>

 

 

자바스크립트는 값을 초기화하면서 변수를 선언한다. 변수를 선언만 해놓고 값을 초기화하지 않으면, 데이터 타입이 'undefined' 상태다.

<script > 
	var a = 10;
	var b = "hello";
	c = 12.34;
	var d;
	
	
	alert(typeof d);
	alert(typeof undefined);
	alert(typeof a); 
	alert(typeof b);
	alert(typeof c);
	
</script>

 

작은 따옴표와, 쌍 따옴표에 대한 차이가 없다. 그러나, 'A" 등으로 쓰면 안된다. 'A', "A" 등은 가능하다.

 


변수 타입 비교 및 호이스팅 개념

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
	for (var i = 1; i <= 1; i++) {
		var one = 10;
		let two = 20;
		const three = 30;
	}

	alert('var 타입의 one 나올까요?')
	alert(one); // 나옵니다. 호이스팅 되기 때문입니다. 즉, 지역변수로 선언해도 전역변수로 쓰일 수 있지요.
	alert('let 타입의 two 나올까요?')
	alert(two); // 안나옵니다. 여기서 undefined 에러가 발생해서, 아래 문장들이 실행되지 않습니다.
	alert('const 타입의 three 나올까요?')
	alert(three); // 안나옵니다.
	
</script>
</head>
<body>

</body>
</html>

 

var 형만 호이스팅이 일어난다. 그래서 아래와 같은 형태로 사용 가능하다.

>>> 호이스팅 문제를 해결하기 위해 나온 타입이 let, const 이다.

>>> var 스코프:  function

>>> 아래의 코드를 실행하고 console에 tags 치면 인식할 수 없음.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
	window.onload = function() {
		 var tags = document.getElementsByTagName('td')
		 console.log(tags)
		 tags[0].innerHTML = '아이디'
		 
		 // let nodes = document.querySelector('td')
		 // 왜 td 태그 중 첫번째 요소만 나오냐? 그게 특징이야.
		 let nodes = document.querySelectorAll('td')
		 console.log(nodes)
		 nodes[1].innerText = '패스워드'
	}
</script>
</head>
<body>
	<table border="1" style="width:100px; height: 100px">
		<tr>
			<td>ID</td>
		</tr>
		<tr>
			<td>PASSWORD</td>
		</tr>
	</table>
</body>
</html>

 

var a = 10;
var a = 100;

내부적으로는 아래와 같이 처리된다.

var a;
a = 10;
a = 100;

 

 

const는 상수이기 때문에 값을 바꿀 수 없다.

let은 재선언이 금지되어있다.

>>> let 스코프: block 

>>> const 스코프 : 확인필요

아래의 코드에서 오류 나는 곳을 찾아보자. (f12 개발자모드로 확인 가능)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
	
	var a = 10;
	let b = 10;
	const c = 10;
	alert(`a = ${a}, b = ${b}, c = ${c}`);
	
	a = a * 5;
	b = b * 5;
	c = c * 5; 
	alert(`a = ${a}, b = ${b}, c = ${c}`);
	
	var a = 100;
	let b = 100;
	alert(`a = ${a}, b = ${b});
	

</script>
</head>
<body>

</body>
</html>

 

const 형과 let 형은 블록 스코프를 가진다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
	
	var a = 10;
	let b = 10;
	const c = 10;
	alert(`a = ${a}, b = ${b}, c = ${c}`);
	
	a = a * 5;
	b = b * 5;
	/* c = c * 5;  */ 
	alert(`a = ${a}, b = ${b}, c = ${c}`);
	
	var a = 100;
	/* let b = 100; */
	alert(`a = ${a}, b = ${b}`); 
	
	
	{
		var temp = 1000;
		let letTemp =2000;
		alert(`temp = ${temp}, letTemp = ${letTemp}`);
		
	}
	
	alert(`temp = ${temp}`);
	/* let, const는 블록스코프를 가진다. 따라서 마지막 문장이 실행되지 않는다. */
	/* let형 사용을 권장한다고 함 */
	alert(`temp = ${temp}, letTemp = ${letTemp}`);
	

</script>
</head>
<body>

</body>
</html>