返回不同类型的JavaScript函数(Array vs NodeList)

JavaScript function that return with different types (Array vs NodeList)

本文关键字:Array vs NodeList 函数 同类型 JavaScript 返回      更新时间:2023-09-26

我编写了一个JavaScript函数,它将返回一个Id以某个值开头的元素的"列表":

function getElementsWithIdPrefix(prefix){
    if (document.querySelectorAll){
        return document.querySelectorAll('*[id^="' + prefix + '"]');
    } else {
        // none modern browsers support
        var elements = document.getElementsByTagName('*');
        var relevantElements = [];
        for (var i = 0; i < elements.length; i++){
            if (element.id && element.id.indexOf(prefix) !== -1){
                relevantElements.push(element);
            }
        }
        return relevantElements;
    }
}

正如你所看到的,我的函数将返回不同的类型取决于浏览器对document.querySelectorAll的支持,我对此有两个问题:

  1. 这不好吗?我的意思是-在JavaScript类型系统中,它是否被认为是代码气味或不良实践?
  2. 我如何为每个元素创建节点对象,并构造一个包含这些元素的新NodeList来返回?

这不好吗?

可能,但这可能是个人意见的问题。

我如何自己为每个元素创建Node对象,并构造一个包含要返回的这些元素的新NodeList ?

你可以把你的QSA结果变成一个真正的数组,像这样:

return Array.prototype.slice.call(document.querySelectorAll('*[id^="' + prefix + '"]'));

这样,你在两种情况下都返回一个数组。


旁注:你必须非常努力地找到一个浏览器,没有QSA。它支持所有现代浏览器,包括IE8。

旁注2:这一行

if (element.id && element.id.indexOf(prefix) !== -1){

…不查找前缀。它在ID中查找匹配的子字符串。前缀使用=== 0(或element.id.substring(0, prefix.length) === prefix)