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.length4。没有问题。 e.length4。没有问题。

如果我使用f = document.querySelectorAll('p');or f = document.getElementsByTagName('p');,为什么g.length是'3'?

谢谢你。

4

1 回答 1

4

没问题,你的第三个数组只是[1, 2, NodeList]. querySelectorAll返回 aNodeList在这种情况下包含两个元素。在第二个示例中,您专门从 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 回答