컴퓨터/JavaScript
[JavaScript] 변수와 자료형
peridott
2024. 7. 4. 09:48
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>변수와 자료형</title>
<style>
.area {
border: 1px solid;
width: 400px;
padding: 10px;
}
</style>
</head>
<body>
<h1>변수와 자료형</h1>
<h2>변수 선언시 var뿐만아니라 let, const를 이용하여 선언 가능</h2>
<h3>var, let, const의 차이점</h3>
<h4>1) 변수의 선언 방법</h4>
<button onclick="diffDeclare();">클릭</button>
<script>
function diffDeclare() {
// 1. var은 중복선언 가능(단점), 재할당 가능
var userId = "user01";
console.log(userId);
var userId = "user02";
console.log(userId);
userId = "user03"; // 재할당
console.log(userId);
console.log("------------------------------------");
// 2. let은 중복선언 불가능(function안에서), 재할당 가능
let userPw = "pass01";
console.log(userPw);
// let userPw = "pass02";
// console.log(userPw);
userPw = "pass03";
console.log(userPw);
console.log("------------------------------------");
// 3. const는 중복선언 불가능, 재할당 불가능(자바에서 상수와 같은 개념 == 한번 초기화된 값 변경 불가능)
// 그러나 객체안에 자료는 변경 가능
const userName = "홍길동";
console.log(userName);
// const userName = "김말똥"; // 중복선언 불가능
// userName = "김말똥"; // 재할당 불가능
// console.log(userName);
/*
* var은 자유롭게 변수 선언, 사용할 수 있다는 장점이 있지만
중복된 변수가 남발할 수 있고, 의도치 않게 값이 변경되어 있을 수 있음 => 가장 큰 단점
=> 단점을 보완하여 나온것이 let, const이다.
* 권장사항 : let, const를 위주로 사용
*/
}
</script>
<h4>2) 스코프(사용가능 범위)</h4>
<button onclick="diffScope();">클릭</button>
<script>
function diffScope() {
// 1. var : 변수가 선언되는 "함수 영역" 내에서 사용가능
var name = "홍길동";
console.log(name);
if(true) {
var age = 20;
}
console.log(age);
for(var i=0; i<10; i++) {
}
console.log(i);
console.log("------------------------------------");
// 2. let, const (block scope) == 변수가 선언된 블럭() 내에서만 사용 가능(자바와 유사)
let address = "서울";
if(true) {
let gender = "M";
const hobby = "운동";
}
// console.log(gender); // 사용불가
// console.log(hobby); // 사용불가
scopeTest();
}
function scopeTest() {
console.log(name);
}
</script>
<h3>* 변수 선언 위치에 따른 전역변수/지역변수</h3>
<script>
// 현재 문서가 다 로딩된 직후에 실행
// window.onload = function() { 현재 문서가 다 로딩된 직후에 실행시킬 코드 }
window.onload = function() {
console.log("문서 로딩 완료!");
}
// 특정 함수 영역 밖에 선언된 변수는 전역변수임(어디든지 사용 가능)
var declareVar = "var 전역변수";
let declareLet = "let 전역변수";
const declareConst = "const 전역변수";
declareNone = "그냥 전역변수"; // 변수명 앞에 아무런 키워드가 없으면 전역변수임
window.onload = function() {
// console.log(declareVar);
// console.log(declareLet);
// console.log(declareConst);
// console.log(declareNone);
// 전역변수와 동일한 이름으로 지역변수 선언
// 전역변수와 지역변수의 이름이 동일하면 지역변수가 우선순위가 더 높다.
var declareVar = "var 지역변수";
let declareLet = "let 지역변수";
const declareConst = "const 지역변수";
console.log(declareVar);
console.log(declareLet);
console.log(declareConst);
console.log(declareNone);
console.log("------------------------------------");
// 만약 전역변수에 접근하고 싶다면 window. 또는 this. 으로 접근 가능(var만 가능)
console.log(window.declareVar);
console.log(this.declareVar);
// let, const는 전역변수를 불러올 수 없음 undefined가 뜸
console.log(this.declareLet);
console.log(window.declareConst);
declareNone = "얘는 뭘까요?";
console.log(declareNone);
console.log(this.declareNone);
test();
}
function test() {
console.log("------------------------------------");
console.log(declareNone);
console.log(declareVar);
console.log(declareLet);
console.log(declareConst);
}
</script>
<h3>* 자료형</h3>
<p>
Dynamic Type : 변수 선언시 자료형을 별도로 지정하지 않음(자료형의 개념이 없는건 아님)<br>
=> 변수별로 타입이 지정되지 않고, 대입되는 값에 의해 타입이 결정 됨
</p>
<h4>자바스크립트의 자료형</h4>
<ul>
<li>string(문자열)</li>
<li>number(숫자)</li>
<li>boolean(논리값)</li>
<li>object(객체)</li>
<li>function(함수)</li>
<li>undefined(초기화가 안된 변수)</li>
</ul>
<button onclick="typeTest();">자료형 테스트</button>
<div class="area" id="area1"></div>
<script>
function typeTest() {
// 문자열 : 쌍따옴표(""), 외따옴표(''), 백틱(``)
const name = '홍길동';
const age = 23;
const flag = true;
const hobby = ['영화', '음악감상', '낮잠']; // 배열 객체
const divE1 = document.querySelector('#area1'); // div요소 객체
// Javascript에서의 객체 선언
const user = {name: '김말똥',
age: 25,
id: 'user01'};
const testfn = function() {
alert('ㅎㅎㅎ');
}
// 상수는 초기화 하지 않으면 오류
// const noVal;
let noVal;
// typeof 변수명 : 자료형 확인시 사용하는 함수
console.log("------------------------------------");
console.log(typeof name, name);
console.log(typeof age, age);
console.log(typeof flag, flag);
console.log(typeof hobby, hobby);
console.log(typeof divE1, divE1);
console.log(typeof user, user);
console.log(typeof testfn, testfn);
console.log(typeof noVal, noVal);
// 문자열 : 쌍따옴표(""), 외따옴표(''), 백틱(``)
// 백틱(ES6) : 사용시 문자열과 변수 사용시 +기호 및 \n을 넣지 않고 사용 가능
let str = 'hello' + name +'나이 : ' + age;
let str1 = `hello ${name} 나이: ${age}`;
let str3 = '이름\n홍길동';
let str4 = `이름
홍길동`;
// divE1.innerHTML = typeof name + ', ' + name + '<br>';
divE1.innerHTML = `${typeof name}, ${name}<br>`;
divE1.innerHTML += `${typeof age}, ${age}<br>`;
divE1.innerHTML += `${typeof flag}, ${flag}<br>`;
divE1.innerHTML += `${typeof hobby}, ${hobby}<br>`;
divE1.innerHTML += `${typeof divE1}, ${divE1}<br>`;
divE1.innerHTML += `${typeof user}, ${user}<br>`;
divE1.innerHTML += `${typeof testfn}, ${testfn}<br>`;
divE1.innerHTML += `${typeof noVal}, ${noVal}<br>`;
// 화면에 출력(텍스트 출력되기 때문에 콘솔출력과 결과가 다를 수 있음)
}
</script>
</body>
</html>