0

コードを参照してください:

<!DOCTYPE html>
<meta charset="utf-8">
<title>An HTML5 Document</title>
<p>
<p>
<script>
    var a = [1, 2],
        b = [3, 4],
        c = a.concat(b),
        d, e, f, g;

    console.log(c); // No problem

    d = [document.querySelectorAll('p')[0], document.querySelectorAll('p')[1]];
    e = a.concat(d);
    console.log(e); // No problem

    f = document.querySelectorAll('p'); // f = document.getElementsByTagName('p');
    g = a.concat(f);
    console.log(g); // Pretty strange...
</script>

jsFiddle: http: //jsfiddle.net/V7gmE

私の質問は:

c.lengthです4。問題はありません。 e.lengthです4。問題はありません。

f = document.querySelectorAll('p');またはを使用する場合f = document.getElementsByTagName('p');、なぜg.length「3」なのですか?

ありがとうございました。

4

1 に答える 1

4

問題はありません。3番目の配列はです[1, 2, NodeList]。この場合は2つの要素を含むquerySelectorAllaを返します。NodeList2番目の例では、具体的にはNodeListから1番目と2番目の要素を取得し、それらを配列に配置します。NodeListは配列のように見えるかもしれませんが、そうではありません。また、NodeListでArray.concatメソッドを使用すると、個々の要素が選択されません。

MDNから:

NodeListは配列と非常によく似ており、Array.prototypeメソッドを使用したくなるでしょう。ただし、これは不可能です。

ここに、要点を理解するのに役立つ可能性のある別の例があります:http: //jsfiddle.net/radu/j5gvy/1/

var a = [1, 2],
    obj = { 0 : '', 1 : ''},
    b = [obj[0], obj[1]];

c = a.concat(obj);

console.log(c.length); // 3

d = a.concat(b);

console.log(d.length); // 4

配列のようにアクセスできるオブジェクトを定義したからといって、それが配列になるわけではありません。

于 2012-07-30T15:30:40.930 に答える