コンテンツにスキップ

JavaScript/DOM/Array-Likeオブジェクト

出典: フリー教科書『ウィキブックス(Wikibooks)』

Array-Likeオブジェクト

[編集]

Array-Likeオブジェクト(配列風オブジェクト)とは、DOMにおいて配列のようにインデックスとlengthプロパティを持ち、[Symbol.iterator]を実装しているオブジェクトのことです。

主な特徴

[編集]

Array-Likeオブジェクトには以下の特徴があります:

  • インデックスプロパティ: 配列と同様に数値インデックスを持つ要素にアクセスできる。
  • lengthプロパティ: 含まれる要素数を示すlengthプロパティを持つ。
  • [Symbol.iterator]の実装: 必ず[Symbol.iterator]を実装しており、for...ofループやforEachが利用可能。

主な例

[編集]

DOMのNodeList

[編集]

document.querySelectorAll()document.getElementsByTagName()などで取得されるArray.prototypeHTMLCollection|HTMLCollectionはArray-Likeオブジェクトです。

const elements = document.querySelectorAll('p'); // NodeListを取得

console.log(elements[0]); // インデックスでアクセス
console.log(elements.length); // 要素数を取得

// Arrayメソッドは使えない
// elements.map(el => el.textContent); // エラー

関数のargumentsオブジェクト

[編集]

argumentsは関数に渡された引数を保持するArray-Likeオブジェクトです。

function example() {
  console.log(arguments[0]); // インデックスでアクセス
  console.log(arguments.length); // 引数の数を取得
}
example('A', 'B', 'C');

// Arrayメソッドは使えない
// arguments.map(arg => console.log(arg)); // エラー

Array-Likeオブジェクトの配列への変換

[編集]

Array-Likeオブジェクトを通常の配列に変換することで、Arrayメソッドを使用可能になります。

Array.from()を使用

[編集]

Array.from()を使用すると、Array-Likeオブジェクトを簡単に配列に変換できます。

const elements = document.querySelectorAll('p'); // NodeListを取得

// Array.from()で配列に変換
const elementArray = Array.from(elements);
elementArray.map(el => console.log(el.textContent));

スプレッド構文を使用

[編集]

スプレッド構文[...Array-Like]も配列への変換に利用できます。

const elements = document.querySelectorAll('p');

// スプレッド構文で変換
const elementArray = [...elements];
elementArray.forEach(el => console.log(el.textContent));

注意点

[編集]
  • Array-LikeオブジェクトはArrayではないため、直接配列のプロトタイプにアクセスできません。
  • 一部の古い環境ではArray.from()がサポートされていない場合があります。その場合はArray.prototype.slice.call()を使用してください。

例:

const argsArray = Array.prototype.slice.call(arguments);

主なArray-Likeオブジェクトの例

[編集]
オブジェクト 説明
NodeList DOM操作で取得される要素のリスト。
HTMLCollection|HTMLCollection タグ名やクラス名で取得されるHTML要素のコレクション。
arguments 関数の引数を保持するオブジェクト。
String 文字列(文字ごとにインデックスでアクセス可能)。

関連項目

[編集]

外部リンク

[編集]