多くの配列メソッドは設計上の一般的なものです。つまり、内部実装がthis
であることがArray
インスタンスに依存していないことを意味します。基本的に、このような実装では、このオブジェクトには数値インデックスとlength
プロパティが必要です。そのようなオブジェクトは、「配列のようなオブジェクト」と呼ばれます。
この要件を満たす多くのオブジェクトがあります。例えば、NodeListは、あなたが観測した場合、document.getElementById('menu').querySelectorAll
です。これは、個々のノードにインデックスでアクセスすることができ、そのノードリストにlength
というプロパティがあるため、配列のようなオブジェクトです。
いずれの文字列も配列のようなオブジェクトです。たとえば、文字列 "hello world"です。文字「w」にstr[t]
としてアクセスできます。 str.length
は11に等しい。
プロパティは、メソッドの実装によって、このコレクションが実際に何であるかを知る必要なく、コレクションのすべての要素を繰り返し処理することができます。
const obj = {0: 'one', 1: 'two', length: 2};
Array.prototype.forEach.call(obj, (el, index) => {
console.log(`${index}: ${el}`)
})
あるいは、そのような「借り」他のプロトタイプメソッドの最も一般的な使用以外の配列のメソッドを使用している:
また、異なるオブジェクト上の一般的なメソッドを使用することを可能にします配列、通常はDOM要素:
const items = document.querySelector('ul > li')
const ids = [].map.call(items, li => li.id)
ここで私は、ES2015仕様のspread operatorがそのような借用方法を必要としないことに注意してください。
ここで何を達成しようとしていますか? – hackerrdave
NodeListにはforEachメソッドがありますか? – evolutionxbox
[ECMAScript 5.1,15.4.4.18](http://www.ecma-international。org/ecma-262/5.1 /#sec-15.4.4.18): "ForEach関数は意図的に汎用であり、この値がArrayオブジェクトである必要はないので、他の種類のオブジェクトに転送してメソッドforEachがホストオブジェクトにうまく適用できるかどうかは、実装に依存するかどうかです._ – Andreas