JavaScript Array.prototype.sort() 无法调用 DOM.HTMLLIElements

JavaScript Array.prototype.sort() CAN NOT call on DOM.HTMLLIElements

我想用Array.prototype.sort()来排序DOM.Element。

我这样试:

    var e = document.getElementById('test-list').children;
    
    [].forEach.call(e,function(ee){
        console.log(ee);
    }); 
    // print each child in e
    
    [].sort.call([3,4,1],function(a,b){
        console.log(a+","+b);
    }); 
    // 3,4; 4,1; [3, 4, 1]; compares every two elements
    
    
    [].sort.call(e,function(a,b){
        console.log(a+","+b);
    }); 
    // CAN NOT work! don't print anything.
    <ol id="test-list">
        <li class="lang">Scheme</li>
        <li class="lang">JavaScript</li>
        <li class="lang">Python</li>
        <li class="lang">Ruby</li>
        <li class="lang">Haskell</li>
    </ol>

Array.prototype.sort()的API的基础上,sort()可以用于普通对象而不是基本类型。

我找到了

e[0].innerText = 232; // <li class="lang">232</li> ;works
e[0] = "123"; //<li class="lang">232</li> ;not work

所以我假设是因为不能直接更改 HTMLLIElements 数组中的元素,sort() 以某种方式弄明白了。所以sort()直接跳出来return。

是吗?又是什么机构帮助sort()决定是否处理Array?

有趣的问题!不像 Chrome 默默死去,最新的 Firefox 更有帮助:

TypeError: HTMLCollection doesn't have an indexed property setter for '0'

这使问题变得清晰:您不能将 sort 应用于没有数字 属性 setter 的对象(因为 sort 尝试就地排序但失败了)。