Collections
Array: スプレッドによるコピーは浅い
配列コンテナはコピーされますが、要素であるオブジェクトは共有されたままです。
SourceshallowCopies.ts
Node.js 22
export type Label = { name: string };
export function copyLabels(labels: readonly Label[]): Label[] {
return [...labels];
}TestshallowCopies.test.ts
Node.js 22
import assert from "node:assert/strict";
import test from "node:test";
import { copyLabels } from "../../src/array/shallowCopies.js";
test("浅いコピーでは要素オブジェクトを共有する", () => {
const original = [{ name: "before" }];
const copied = copyLabels(original);
copied.push({ name: "new" });
copied[0]!.name = "updated";
assert.equal(original.length, 1);
assert.equal(original[0]!.name, "updated");
});01Assertion
このテストで確認できること
- コピーした配列へ要素を追加しても元の配列は変わらない
- 共有した要素オブジェクトの変更は両方から観測される
スプレッド構文は配列の入れ物だけを複製します。入れ子のオブジェクトまで独立させる必要がある場合は、明示的な変換を設計します。
OBSERVED RESULT
expected: original.length → 1
actual: 1
expected: original[0].name → updated