_
사용가능변수 선언 키워드 (var, let, const)로 변수 이름을 선언하면, 메모리 공간을 확보하여 값을 저장하기 위한 준비를 한다.
자바스크립트 엔진은 변수 선언을 2단계에 걸쳐 수행한다.
(초기화 단계를 거치지 않으면, 확보된 메모리 공간에는 이전에 사용했던 쓰레기 값이 남아있을 수 있다. 자바스크립트 엔진은 암묵적으로 초기화를 수행하기 때문에 상관 없다.)
변수 선언은 코드가 한 줄씩 순차적으로 실행되기 이전에, 소스코드의 평가 과정에서 완료된다.
console.log(score);// undefined. ReferenceError(참조 에러)가 아닌 undefined 출력var score;// 변수 선언문
변수에 값을 할당할 때는 소스코드의 평가 과정 이후, 소스코드가 순차적으로 실행되는 시점인 런타임에 실행된다.
변수 호이스팅(Variance Hoisting)
→ 자바스크립트 엔진과 브라우저에서 스크립트를 로드할 때 전체 스크립트를 확인해서 함수나 변수를 파일의 시작 부분으로 가져오고 (메모리 공간을 선언 전에 미리 할당하는 것을 의미)초기화는 그대로 둬서 실제 코드를 작성한 위치에서 값을 할당한다. 이 때 var로 선언된 변수일 경우, 호이스팅이 발생할 때 값을 undefined로 초기화 한다.
parseInt
: string, float ⇒ int로 파싱parseFloat
: string, int ⇒ floart으로 파싱+
연산자를 값 앞에 붙히면 number타입으로 변경된다조건문, 반복문과 타입확인을 활용한 계산기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
const operators = ['+','-','*','/']
let arg1
let arg2
let operator
let result;
while (true) {
arg1 = +prompt('Enter the number1')
if (Object.is(arg1, NaN)) {
alert('Enter the Valid Number')
continue
}
break;
}
while (true) {
operator = prompt('Enter the operator')
if (!operators.includes(operator)) {
alert('Enter the Valid Operator')
continue
}
break;
}
while (true) {
arg2 = +prompt('Enter the number2')
if (Object.is(arg2, NaN)) {
alert('Enter the Valid Number')
continue
}
break;
}
switch (operator) {
case '+':
result = arg1 + arg2;
break;
case '-':
result = arg1 - arg2;
break;
case '*':
result = arg1 * arg2;
break;
case '/':
if (arg2 === 0) result = 'Cannot divide by zero'
result = arg1 / arg2;
break;
default:
result = 'Unknown Error Occurred'
break;
}
document.write(`${typeof result === 'string' ? result : `${arg1} ${operator} ${arg2} = ${result}`}`);
</script>
</head>
<body></body>
</html>
{ }
안에서 함수를 정의하는 자바스크립트 표현function square(number) {
return number * number;
}
매개변수의 값이 함수로 전달되고 함수내의 자바스크립트 표현식이 전달된 값을 이용하여 코드를 실행한다.
var square = function(number) { return number * number };
(param1, param2, …, paramN) => { statements }
(param1, param2, …, paramN) => expression
==(param1, param2, …, paramN) =>``{ return expression; }
new
, target
키워드가 없다.화살표 함수의 this 언제나 상위 스코프의 this를 가리킨다.(Lexical this)
call, apply, bind 메소드를 사용하여 this를 변경할 수 없다.
function fun() {
this.name = "HELLO";
return {
name: "WORLD",
speak: function () {
console.log(this.name);
},
};
}
function arrFun() {
this.name = "HELLO";
return {
name: "WORLD",
speak: () => {
console.log(this.name);
},
};
}
const fun1 = new fun();
fun1.speak(); // HELLO
const fun2 = new arrFun();
fun2.speak(); // WORLD
일반함수로 사용했을때는 WORLD,
화살표함수를 사용했을때는 HELLO
가 출력된다
일반 함수는 생성자 함수로 사용할 수 있다.
화살표 함수는 생성자 함수로 사용할 수 없다.(prototype 프로퍼티를 가지고 있지 않기 때문)
function fun() {
this.num = 1234;
}
const arrFun = () => {
this.num = 1234;
};
const funA = new fun();
console.log(funA.num); // 1234
const funB = new arrFun(); // Error
일반 함수 에서는 함수가 실행 될때 암묵적으로 arguments 변수가 전달되어 사용할 수 있다.
화살표 함수에서는 arguments 변수가 전달되지 않는다.
function fun() {
console.log(arguments); // Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]
}
const arrFun = () => {
console.log(arguments); // Uncaught ReferenceError: arguments is not defined
};
fun(1, 2, 3);
arrFun(1, 2, 3);
브라우저에서의 이벤트란?
브라우저(시스템)에서 일어나는 사건이나 발생
Document Object Model (DOM) - Web APIs | MDN
html 문서로부터 특정 엘리먼트(태그)를 조작하기 위해 자바스크립트 객체로 가져오기 위해 사용하는 브라우저 내장 함수
getElementById()
id명과 일치하는 엘리먼트 객체를 반환
일치하는 엘리먼트가 없다면 null을 반환
복수개 반환시 **getElementBy(Name, ClassName, Tagname)()
사용** ⇒ HTMLCollection
반환
**HTMLCollection
- 유사 배열
- 인덱스나 반복문을 통해 요소에 접근 가능하나 배열 메서드는 사용 불가
- Live Collection**
- DOM 변경 사항이 실시간으로 반영됨
element = document.getElementById(id);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<script>
const getInput = () => document.getElementById('number').value;
const showResult = () => {
let result = true;
const input = getInput();
if (isNaN(input) || input > 100 || input < 2){
alert("Enter the valid number")
return;
}
if (input <= 3) {
document.getElementById('result').innerHTML = `${input} is PrimeNumber? ⇒ ${result}`
return;
}
if (input % 2 == 0) {
result = false;
document.getElementById('result').innerHTML = `${input} is PrimeNumber? ⇒ ${result}`
return;
}
for (let i = 3; i < input / 2; i++) {
if (input % i === 0) {
result = false;
break;
}
}
document.getElementById('result').innerHTML = `${input} is PrimeNumber? ⇒ ${result}`
}
</script>
<body>
<label>Input</label>
<input type="text" id="number" placeholder="Enter the number (2-100)">
<input type="button" id="primebtn" value="Enter" onclick="showResult()">
<div id="result">is PrimeNumber? ⇒ </div>
</body>
</html>
querySelecor()
선택자와 일치하는 첫 번째 엘리먼트 객체를 반환
일치하는 엘리먼트가 없다면 null을 반환
복수개 반환하기 위해서 querySelectorAll()
사용 ⇒ NodeList
반환
NodeList
- 유사 배열
- 인덱스나 반복문을 통해 요소에 접근 가능하나 배열 메서드 사용 불가
- forEach()
, entries()
, keys()
, values()
는 사용 가능
- Static Collection (Non-Live Collection)
- DOM의 변경 사항이 실시간으로 반영되지 않음
element = document.querySelector(selectors)
var object = {
property1: 'value1',
property2: 'value2',
...
method1: function(){...}
method2: function(){...}
...
};
function User(name, genter) {
this.name = name;
this.gender = gender;
}
let user = new User("User1", "Male");
리스트 형태의 객체인 배열을 생성할 때 사용하는 전역(내장)객체
window
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
let watch;
const findLocation = function () {
watch = navigator.geolocation.watchPosition(
// Success Callback
({coords: {latitude, longitude}}) => {
document.getElementById('result').innerHTML = `<h3>(latitude : ${latitude}, longitude: ${longitude})</h3>`
open(`https://maps.google.com?q=${latitude},${longitude}`, 'location information', 'width=1200, height=800')
},
// Failure Callback
(positionError) => {
document.getElementById('result').innerHTML = `Error: ${positionError.message} (code: ${positionError.code})`
});
}
const cancel = function () {
navigator.geolocation.clearWatch(watch)
document.getElementById('result').innerHTML = `<h3> start find your device location </h3>`
}
</script>
<input type="button" value="find location" id="detect" onclick="findLocation()">
<input type="button" value="cancel" id="stop" onclick="cancel()">
<div id="result">
<h3>start find your device location</h3>
</div>
</body>
</html>