javascript数组推送问题

javascript数组推送问题,javascript,arrays,push,Javascript,Arrays,Push,我有以下javascript代码: var objectArray = []; var allInputObjects = []; var allSelectObjects = []; var allTextAreaObjects = []; //following returns 3 objects allInputObjects = document.getElementById("divPage0").getElementsByTagName("INPUT"); //following

我有以下javascript代码:

var objectArray = [];
var allInputObjects = [];
var allSelectObjects = [];
var allTextAreaObjects = [];

//following returns 3 objects
allInputObjects = document.getElementById("divPage0").getElementsByTagName("INPUT");

//following returns 1 object
allSelectObjects = document.getElementById("divPage1").getElementsByTagName("SELECT");

//following returns 0 objects
allTextAreaObjects = document.getElementById("divPage2").getElementsByTagName("TEXTAREA");

//and following statement does not work
objectArray = allInputObjects.concat(allSelectObjects);
我的问题是最后一行抛出了一个错误

我在Firefox中尝试了上面的代码,它说allInputObjects.concat不是一个函数

任何线索,我相信脚本没有把AllinPutObject当作数组

任何帮助都将不胜感激。

为什么您认为allSelectObjects是一个数组

它最初分配给一个空数组,当然。但是第6ish行的getElementsByTagName调用会覆盖它。Javascript中的变量不是强类型的,因此初始赋值不会强制以后的赋值也为数组

我怀疑在调用最后一行时,变量中会有某种类型的节点列表或类似的节点列表,而不是数组。至少在Firefox中是这样的。

为什么你认为allSelectObjects是一个数组

它最初分配给一个空数组,当然。但是第6ish行的getElementsByTagName调用会覆盖它。Javascript中的变量不是强类型的,因此初始赋值不会强制以后的赋值也为数组


我怀疑在调用最后一行时,变量中会有某种类型的节点列表或类似的节点列表,而不是数组。至少在Firefox中是这样的。

正如Andezj所指出的,这里处理的不是数组,而是一种节点列表

下面是一种基于getElementsByTagName的结果创建要使用的数组的方法


正如Andezj所指出的,这里处理的不是数组,而是一种节点列表

下面是一种基于getElementsByTagName的结果创建要使用的数组的方法

getElementsByTagName返回一个节点列表,它与数组类似,只是它不支持所有这些原型函数

要将类似数组的对象无缝转换为数组,请使用:

var arr = Array.prototype.slice.call(somenodelist, 0);
arr将几乎相同,只是它现在支持阵列原型函数,如concat

该函数实际执行的是返回一个包含somenodelist元素的部分数组,确切地说是从索引0及其后的所有元素。显然,这只是所有元素,因此这是一个将类似数组的对象转换为真实数组的技巧。

getElementsByTagName返回一个节点列表,它与数组类似,只是它不支持所有这些原型函数

要将类似数组的对象无缝转换为数组,请使用:

var arr = Array.prototype.slice.call(somenodelist, 0);
arr将几乎相同,只是它现在支持阵列原型函数,如concat


该函数实际执行的是返回一个包含somenodelist元素的部分数组,确切地说是从索引0及其后的所有元素。显然,这只是所有元素,因此这是将类似数组的对象转换为真实数组的技巧。

这是将节点列表转换为数组的另一种有趣方式:

var tags = obj.getElementsByTagName('input'),
    tags2Arr = ( 
           function toArr(i){
             return i ? toArr(i-1).concat(tags[i]) : [tags[0]];
           }(tags.length-1) 
    );
现在,如果向Array.prototype添加方法:

可以使用以下oneliner将节点列表转换为数组:

Array.prototype.clone.call(obj.getElementsByTagName('input'));

这是将节点列表转换为数组的另一种有趣方式:

var tags = obj.getElementsByTagName('input'),
    tags2Arr = ( 
           function toArr(i){
             return i ? toArr(i-1).concat(tags[i]) : [tags[0]];
           }(tags.length-1) 
    );
现在,如果向Array.prototype添加方法:

可以使用以下oneliner将节点列表转换为数组:

Array.prototype.clone.call(obj.getElementsByTagName('input'));

+1,因为这包含了将节点列表转换回数组问题的实际解决方案。当传递给本机ECMAScript函数时,您不能期望主机对象正常工作。在这种情况下,IE至少会失败。@RobG:真的吗?我相信jQuery在它的.toArray函数中也使用了这个函数。+1,因为它包含了将节点列表转换回数组问题的实际解决方案。当传递给本机ECMAScript函数时,您不能期望宿主对象有行为。在这种情况下,IE至少会失败。@RobG:真的吗?我相信jQuery也在其中使用了这个函数。toArray函数。