let matches = document.querySelectorAll("p"); // HTML 문서에서 요소 찾기
<div class="container">
    <p>자손 요소입니다.</p>
</div>
let container = document.querySelector(".container"); // parentNode 객체(부모 요소 객체)입니다.

let matches = container.querySelectorAll("p"); // parentNode 객체(부모 요소 객체) 내에서 요소 찾기
/* let matches = document.querySelectorAll(".container p");와 동일한 반환값입니다. */
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>querySelectorAll() 함수</title>     
    </head>
    <body>
        <ul>
            <li>김밥</li>
            <li>라면</li>
            <li>떡볶이</li>
        </ul>
        <script src="queryselectorall.js"></script>
    </body>
</html>
const liElements = document.querySelectorAll("li");  // li 선택자를 모두 선택
console.log(liElements); // NodeList(3) [li, li, li]

/*
 * 이 목록은 유사 배열입니다.
 * 이 목록의 요소는 순회를 통해서 특정 작업을 수행할 수 있습니다.
*/

/* 방법 1 - for...of 문 적용 */
for (const liElement of liElements) {
    console.log(liElement.textContent);
}
/*
    김밥
    라면
    떡볶이
*/

/* 방법 2 - for 문 적용 */
for (let i = 0; i < liElements.length; i++) { // length 속성 사용 가능
    console.log(liElements[i].textContent);
}
/*
    김밥
    라면
    떡볶이
*/

/* 방법 3 - forEach() 함수 적용 */
liElements.forEach(li => { // 유사 배열이지만 forEach() 함수 적용이 가능
    console.log(li.textContent);
});
/*
    김밥
    라면
    떡볶이
*/
// HTML 문서 전체에서
document.querySelectorAll(selectors)

// 특정 요소 내에서
parentNode.querySelectorAll(selectors)
// HTML: <p class="highlight">이 요소들의 스타일을 변경합니다.</p>
const highlightedElements = document.querySelectorAll(".highlight");

for (let i = 0; i < highlightedElements.length; i++) {
    highlightedElements[i].style.backgroundColor = "yellow";
    highlightedElements[i].style.color = "green";
}
/*
    HTML:
    <ul id="myList">
        <li>항목 1</li>
        <li>항목 2</li>
        <li>항목 3</li>
    </ul>
*/
const listItems = document.querySelectorAll("#myList li");

for (let i = 0; i < listItems.length; i++) {
    console.log("항목 " + (i + 1) + ": " + listItems[i].textContent);
}
/*
    HTML:
    <ul id="myLinks">
        <li><a href="#">링크 1</a></li>
        <li><a href="#">링크 2</a></li>
    </ul>
*/
const linkList = document.querySelectorAll("#myLinks a");

for (let i = 0; i < linkList.length; i++) {
    linkList[i].addEventListener("click", function(event) {
        event.preventDefault();
        alert("링크가 클릭되었습니다!");
    });
}
<!DOCTYPE html>
<html lang="ko">
    <head>
        <title>querySelectorAll() 예제</title>
    </head>
    <body>
        <div id="myElement">이 요소를 선택할 수 있습니다.</div>
        <script>
            const nonExistentElement = document.querySelectorAll("#nonExistentElement");
            
            if (nonExistentElement.length === 0) { // length 속성을 사용해서 nodeList 객체의 길이에 접근 가능
                console.log("일치하는 요소가 없습니다.");
            } else {
                console.log("일치하는 요소를 찾았습니다.");
            }
        </script>
    </body>
</html>
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>NodeList</title>     
    </head>
    <body>
        <ul id="list">
            <li>김밥</li>
            <li>라면</li>
            <li>떡볶이</li>
        </ul>
        <p><li> 요소의 개수: <strong id="li-length-val">3</strong></p>
        <button type="button" id="addButton">새로운 메뉴 추가</button>
        <script src="none-live.js"></script>
    </body>
</html>
// <li> 요소 가져오기
const liElements = document.querySelectorAll("li");

// 버튼 클릭 시 새로운 <li> 요소 추가
document.getElementById('addButton').addEventListener("click", () => {
    const newLi = document.createElement("li");
    newLi.textContent = '새로운 메뉴';

    // 새로운 <li> 요소를 <ul>에 추가
    document.getElementById("list").appendChild(newLi);

    // <li> 요소의 개수 실시간 확인
    const liElementsLength = liElements.length; // 이미 선언했던 liElements의 length가 실시간 반영됨
    document.getElementById("li-length-val").textContent = liElementsLength;
});
브라우저에서 실제 표시된 모습 버튼을 클릭해 보세요!
querySelectorAll() 함수의 브라우저 호환성
함수
데스크탑 Chrome
Chrome
데스크탑데스크탑 Edge
Edge
데스크탑 Firefox
Firefox
Safari
Safari
querySelectorAll() 1 12 3.5 3.1

caniuse.com에서 더 자세한 정보를 확인해 보세요.