
Tip
html 내 Script 파일 배치 시, 늘 body 안에만 작성해왔다.
이유는 html 문서가 모두 로드 후 script가 실행되므로, 에러를 줄이기 위해서이다.
그러나 다른 곳에 script 파일을 배치할 때 'defer' 라는 키워드를 속성으로 사용하면 문서가 모두 로드 후 script가 실행된다고 한다.
<script defer src="./active3.js"></script>
let num = 1;
let num2 = num;
console.log(num, num2); // 1 1
console.log(num === num2); // true
num = 5; // 1 -> 5
console.log(num, num2); // 5 1
console.log(num === num2); // false
const obj = { one: 1, two: 2 };
const obj2 = obj;
console.log(obj, obj2); // { one: 1, two: 2 }
console.log(obj === obj2); // true
obj.five = 5;
console.log(obj, obj2); // { one: 1, two: 2, five: 5 }
console.log(obj === obj2); // true
// obj와 obj2는 현재 같은 데이터를 갖고 참조값(address, 주소)도 같다
const obj3 = { one: 1, two: 2 };
const obj4 = { one: 1, two: 2 };
console.log(obj3, obj4);
console.log(obj3 === obj4); // false
// why? obj3와 obj4는 현재 같은 데이터를 갖지만, 서로 다른 별도의 객체
즉, 참조값(address, 주소)가 다르다.
pass by Value는 심볼릭 링크, pass by Reference는 하드 링크와 비슷하게 이해하면 될 것 같다.
obj={hi:'hi'}; // 에러
const 선언: 재선언 불가 => 재선언 시 참조 주소 재할당 하게 됨
let jan_01_1970 = new Date(0);
console.log(jan_01_1970);
let jan_02_1970 = new Date(24 * 3600 * 1000);
console.log(jan_02_1970);
let date2 = new Date("2023", "06", "17"); // MM(0(1월)~11(12월) 주의)
console.log(date2);
console.log(Math.E);
console.log(Math.PI);
console.log(Math.SQRT2);
console.log(Math.min(100, -2, -99, 1000));
console.log(Math.max(100, -2, -99, 1000));
console.log(Math.round(100, -2, -99, 1000)); //반올림
console.log(Math.ceil(100, -2, -99, 1000)); //올림
console.log(Math.floor(100, -2, -99, 1000)); //내림
console.log(Math.random()); //0<=x<1 범위의 난수
document.querySelectorAll(".pink").forEach((ele) => console.log(ele));
const pinks = document.querySelectorAll(".pink");
for (let pink of pinks) {
console.log(pink);
}
// document.getElementsByClassName(".pink").forEach((ele) => console.log(ele)); //forEach is not a function
Array.from(document.getElementsByClassName(".pink")).forEach((ele) =>
console.log(ele)
);
div1.innerHTML = "여기는 <b>첫번째<b> 태그 입니다."; //<b> 인식 됨
div1.innerText = "여기는 <b>첫번째<b> 태그 입니다."; //text 그대로 출력
div1.textContent = "여기는 <b>첫번째<b> 태그 입니다."; // text 그대로 출력
console.log(document.getElementById("pooh").getAttribute("src"));
// 속성 접근 (.) 연산자로도 가능
console.log(document.getElementById("pooh").src);
console.log(document.getElementById("naver").href);
document.getElementById("naver").href = "#";
console.log(document.getElementById("naver").href);
for (let li of list) {
li.style.backgroundColor = "purple";
li.style.color = "white";
}
console.log(friends.children); //유사 배열, 자식 모두 선택
console.log(friends.children[0]);
인덱싱 + 반복문 역시 가능
console.log(tigger.parentNode);
console.log(tigger.previousElementSibling);
console.log(tigger.nextElementSibling);
console.log(tigger.nextElementSibling.nextElementSibling);
console.log(tigger.parentElement.parentElement);
const p = document.createElement("p"); //요소 생성
//js로 <p></p> 태그 만듦
console.log(p); //<p></p>
p.innerText = "새로 추가 된 p 요소입니다.";
p.style.color = "pink";
p.style.backgroundColor = "navy";
뒤에 추가
- x.append(y) : x요소의 맨 마지막 자식으로 y 요소 추가
- x.appendChild(y) : 한 번에 하나만 추가 가능 != append
앞에 추가
- x.prepend(y): x요소의 맨 처음 자식으로 y 요소가 추가
todoForm.addEventListener("submit", (e) => {
console.log("submit");
e.preventDefault(); //폼 submit 이벤트가 새로고침 되는 걸 막음
// 폼 제출 막음
이벤트의 디폴트 행동을 막음
MDN
const newTodo = todoInput.value.trim();
스페이스바 연속 => 공백 방지 위해 trim()
const chgInput = document.querySelector("#change-input");
chgInput.addEventListener("change", function () {
console.log("change!!", e.target.value);
});
chgInput.addEventListener("input", function () {
console.log("changing!");
const div = document.querySelector(".intro");
div.textContent = this.value; //실시간 텍스트 동기화
});