Symbol.isConcatSpreadable 심볼이란?
Symbol.isConcatSpreadable은 자바스크립트의 잘 알려진 심볼(well-known symbol) 중 하나로, Array.prototype.concat() 메서드로 배열을 병합할 때 중첩된 배열을 개별 요소로 펼칠지(flatten) 여부를 지정하는 데 사용됩니다.
기본적으로 concat() 메서드는 배열 인수를 만나면 해당 배열의 요소들을 하나씩 꺼내 새 배열에 추가합니다. 하지만 대상 객체의 Symbol.isConcatSpreadable 속성을 false로 설정하면, 그 배열은 더 이상 펼쳐지지 않고 하나의 단일 요소로 취급됩니다.
- true 또는 미설정(기본값): 배열이 개별 요소로 펼쳐져 병합됩니다.
- false: 배열 전체가 하나의 요소로 그대로 추가됩니다.
예제 코드
다음은 Symbol.isConcatSpreadable 심볼의 동작을 확인할 수 있는 예제입니다 −
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
body {
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
}
div {
font-size: 20px;
font-weight: 500;
}
.result {
color: red;
}
</style>
</head>
<body>
<h1>JavaScript Symbol.isConcatSpreadable symbol</h1>
<div class="sample"></div>
<button class="Btn">CLICK HERE</button>
<h3>
Click on the above button to concat the both array into a single one
</h3>
<div class="result">isConcatSpreadable = true</div>
<div class="result">isConcatSpreadable = False</div>
<script>
let fillEle = document.querySelector(".sample");
let result = document.querySelectorAll(".result");
let ele = [1, 2, 3];
let ele2 = ["A", "B", "C"];
let concatArr;
fillEle.innerHTML += ele + "<br>" + ele2 + "<br>";
document.querySelector(".Btn").addEventListener("click", () => {
concatArr = ele.concat(ele2);
for (let x of concatArr.entries()) {
result[0].innerHTML += x + " - ";
}
result.innerHTML += "<br><br>";
ele2[Symbol.isConcatSpreadable] = false;
concatArr = ele.concat(ele2);
for (let x of concatArr.entries()) {
result[1].innerHTML += x + " - ";
}
});
</script>
</body>
</html>
출력 결과

위 화면에서 "CLICK HERE" 버튼을 클릭하면 다음과 같은 결과를 확인할 수 있습니다 −

첫 번째 결과에서는 ele2 배열이 기본 동작대로 개별 요소("A", "B", "C")로 펼쳐져 병합된 것을 볼 수 있습니다. 반면 두 번째 결과에서는 ele2[Symbol.isConcatSpreadable] = false;가 적용되어, ele2 배열 전체가 하나의 요소로 추가된 것을 확인할 수 있습니다.