js의 Front end 라이브러리중 하나로 높은 시장 점유율을 아직 갖고있다.
head -> body -> html 밖
자바스크립트와-엔진-그리고-실행-방식
var: mutable, 중복정의 가능하다, 사이드 이펙트 통제불가로 최근 안쓰는 추세
let: 재할당 가능
const : 재할당 불가
기본연산자
++/--/a*
b/a**
b
나머지 연산자
큰 숫자를 다룰때, 나머지 연산자를 이용하여 작은 숫자로 바꿔 부하를 줄인후 사용
a % b
플러스(+)연산으로 문자열 붙이기. 숫자와 문자도 타입이 다르지만 문자로 붙으므로 주의
1+'a' -> '1a'
논리 연산자
a && b
a 에는 false일 확률이 높은 조건을 둔다. 그럼 뒤의 b를 검사하지 않아도 false니까 뒤 문장을 실행하지 않아 성능이 향상된다.
a || b
a 에는 true 확률이 높은 조건을 둔다. 그럼 뒤의 b를 검사하지 않아도 true이므로 뒤 문장을 실행하지 않아 성능이 향상된다.
!true, !false
조건문에서 비교연산보다는 직접적인 boolean을 넣어줄때 성능이 향상됨
<!DOCTYPE html>
<html lang="en">
<head>
<title>function</title>
<script type="text/javascript">
function add(num1, num2){
return num1+num2;
}
const add1 = function(num1, num2){
return num1+num2;
}
// arrow function
const add2 = (num1, num2) => {
return num1+num2;
}
const result = add(10,20);
console.log(result);
const result1 = add1(1,2);
console.log(result1);
const result2 = add2(11,22);
console.log(result2);
</script>
</head>
<body>
</body>
</html>
기존 function과 arrow function의 차이?
this 객체가 가리키는 대상이 다르다. 그래서 arrow function을 사용한다.
파라미터로 데이터(오브젝트, 상수 등) 외에도 함수를 넘겨줄수도 있다. 이게 콜백함수 개념이다. 자주쓰는 패턴이다. 제이쿼리는 보통 콜백함수 개념으로 작성되어있다.
DOM이란?
트리구조로 html을 접근할수있게 문서화한 것
https://poiemaweb.com/js-dom
event
<button onclick="javascript:console.log('click');">click</button>
<!DOCTYPE html>
<html lang="en">
<head>
<title>event</title>
<script type="text/javascript">
const clickEvent= function(){
// console.log('click');
document.getElementById("box").innerText = "click"; //blank -> click
}
</script>
</head>
<body>
<button onclick="javascript:clickEvent();">click</button>
<div id ="box">blank</div>
</body>
</html>
셀렉터 + 루프를 이용해서 바꾸기
<!DOCTYPE html>
<html lang="en">
<head>
<title>event</title>
<script type="text/javascript">
const clickEvent= function(){
// console.log('click');
// document.getElementById("box").innerText = "click"; //blank -> click
const list = document.getElementById("list");
const liList = list.getElementsByTagName("li");
for (let index = 0; index < liList.length; index++) {
liList[index].innerText = "click"+(index+1);
}
}
</script>
</head>
<body>
<button onclick="javascript:clickEvent();">click</button>
<div id ="box">blank</div>
<ul id = "list">
<li>1</li>
<li>2</li>
<li>3</li>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</body>
<!DOCTYPE html>
<html lang="en">
<head>
<title>event</title>
<script type="text/javascript">
const clickEvent= function(){
// console.log('click');
// document.getElementById("box").innerText = "click"; //blank -> click
const list = document.getElementById("list");
const liList = list.getElementsByTagName("li");
for (let index = 0; index < liList.length; index++) {
liList[index].innerText = "click"+(index+1);
}
}
//body page loading 완료 후 발생하는 이벤트로 딱 한번 실행
window.onload = function(){
document.getElementById("btn").onclick = function(){
clickEvent();
}
};
</script>
</head>
<body>
<!-- <button>click</button> -->
<button id="btn">click</button>
<div id ="box">blank</div>
<ul id = "list">
<li>1</li>
<li>2</li>
<li>3</li>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</body>
</html>
아래코드에서 clickEvent();를 바로 onclick에 고정 부여하지 않고 function에 넣는 이유는, 다른 함수들도 일괄실행하는 확장성을 위해서이다.
또한, clickEvent와 같이 ()를 붙이지 않는것은 onload시 바로 최초 실행되는 것을 방지하여 클릭시에만 함수가 실행되도록 하기위해서이다.
//고정부여
document.getElementById("btn").onclick = clickEvent;
// document.getElementById("btn").onclick = clickEvent();
window.onload = function(){
document.getElementById("btn").onclick = function(){
clickEvent();
}
};
const init = () => {
//console.log('page load!');
document.getElementById("btn").onclick = function(){
const link = document.getElementById("link");
console.log(link.getAttribute("target"));
//여기서 href는 dom 객체의 property임을 구분해야함.
link.href="http://www.google.com";
link.innerText="google";
link.target = "_blank";
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<title>attribute / property</title>
<script type="text/javascript">
const init = () => {
//console.log('page load!');
//노출이 안되는 경우이므로 아래 property방식이 더좋다
document.getElementById("btn").num = "9999";
document.getElementById("btn").onclick = function(){
console.log(this.num);
// //실제 태그를 건드릴때, target속성은 존재하지 않으므로 null
// console.log(link.getAttribute("target"));
// //properties를 건드릴때, target속성은 공백값으로 존재
// console.log(link.target);
const list = document.getElementById("list");
const liList = list.getElementsByTagName("a");
// console.log(liList);
for (let index = 0; index < liList.length; index++) {
console.log(liList[index].getAttribute("num"));
}
// const link2 = document.getElementById("link2");
// //사용자 정의 attribute 가져오기
// console.log(link2.getAttribute("num"));
// //여기서 href는 dom 객체의 property임을 구분해야함.
// link.href="http://www.google.com";
// link.innerText="google";
// link.target = "_blank";
}
}
window.onload = init;
</script>
</head>
<body>
<button id = "btn">click</button>
<hr />
<!--attribute에 직접num 마킹 -->
<ul id ="list">
<li><a href="http://www.naver.com" id="link1" num="1">naver</a></li>
<li><a href="http://www.google.com" id="link2" num="2">google</a></li>
<li><a href="http://www.google.com" id="link3" num="3">google</a></li>
</ul>
</body>
</html>
document.getElementById("btn").onclick = function(){
const link = document.getElementById("link1");
console.log(this.num);
//실제 태그내 Attribute를 건드릴때, target속성은 존재하지 않으므로 null
console.log(link.getAttribute("target"));
//properties를 건드릴때, target속성은 공백값으로 존재
console.log(link.target);
document.getElementById("btn").num = "9999";
<!--attribute에 직접num 마킹 -->
<ul id ="list">
<li><a href="http://www.naver.com" id="link1" num="1">naver</a></li>
<li><a href="http://www.google.com" id="link2" num="2">google</a></li>
<li><a href="http://www.google.com" id="link3" num="3">google</a></li>
</ul>
js를 통해 Dom에 정보가 바뀌면, 아래 전체 1~5 과정을 전체 재실행한다.
reflow : 레이아웃을 바꾸는것(grid 등 배치)
repaint : 꾸미는 요소를 넣음
js에서 Array는 가변적이다.
https://jsbin.com/
const arr1 = [1,2,3];
const arr2 = arr1; // arr1 == arr2 참조값이 같다
console.log(arr1==arr2);
//기존 배열에 추가
arr1.push(4);
console.log(arr1); //1,2,3,4
console.log(arr2); //1,2,3,4
const arr3 = arr1.concat([5]); // 신규 array 생성하여 추가. 리액트의 경우 이렇게 신규로 넣어줘야 인식함
console.log(arr1); //1,2,3,4
console.log(arr2); //1,2,3,4
console.log(arr3); //1,2,3,4,5
map() 메소드를 사용하여 배열에 대해 반복 처리
const arr1 = [1,2,3];
const result = arr1.map(
(currentValue,i,arr1) => {
// 배열 각 요소에 모두 10을 더한다
return currentValue+10;
}
);
// arr1은 기존과 동일하며, result에 신규생성 배열이 담긴다
console.log(arr1, result);
자세한 설명: https://www.freecodecamp.org/korean/news/javascript-map-method/
const result = arr1.reduce(
(total, currentValue) => {
return total+currentValue;
}
);
console.log(result);// 6
const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((acc, el, i) => {
console.log(`${i}번째 콜백함수`)
// 리턴시 다음 루프의 첫번째 파라미터에 값이 담긴다
console.log(`acc: ${acc}`);
// 두번째 파라미터는 map과 동일하게 순회중인 배열 요소가 담긴다
console.log(`el: ${el}`);
return el + acc;
}, 0);
console.log(`-----------`);
console.log(`sum: ${sum}`);
콘솔 결과
"0번째 콜백함수"
"acc: 0"
"el: 1"
"1번째 콜백함수"
"acc: 1"
"el: 2"
"2번째 콜백함수"
"acc: 3"
"el: 3"
"3번째 콜백함수"
"acc: 6"
"el: 4"
"-----------"
"sum: 10"
기초
https://bigtop.tistory.com/69
활용
https://velog.io/@favorcho/%EB%B0%B0%EC%97%B4%EC%9D%98-reduce-%EB%A9%94%EC%84%9C%EB%93%9C
검색할때 사용, 조건에 따른 특정 요소를 제외하고 싶을때
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
const words = ['spray', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter((word) => word.length > 6);
console.log(result);
// Expected output: Array ["exuberant", "destruction", "present"]
const num = [1,2,3,4,5];
const result = num.filter(
(num) => num % 2 == 1
);
console.log(result);
// Expected output: Array [1, 3, 5]
aws: Amazon api gateway
통과만큼 중요한건 코드스타일