数组中被indexOf忽略的元素

3
我有以下函数。除了注释中指出的“if”语句之外,一切正常运行。
function markRow(e) {
    var row = e.currentTarget.value ;

    var id, rid, field, color, ico ;

    rid = markedrows.indexOf(row) ;
    if (rid != -1) {
        markedrows.splice(rid, 1) ;
        ico = ICO_FOLDER + ICO_PLUS ;
        color = COLOR_UNMARKED ;
    } else {
        markedrows.push(row) ;
        ico = ICO_FOLDER + ICO_MINUS ;
        color = COLOR_MARKED ;
    }

    e.currentTarget.src = ico ;

    for (var col = 1 ; col <= current.cols() ; col++) {
        alert(col) ;
        alert(markedcols.toString()) ;
        // This 'if' doesn't seem to work
        if (markedcols.indexOf(col) == -1) {
            // This part is ALWAYS executed even when the column is in markedcols
            // I get no error messages in firefox
            id = "r" + row + "c" + col ;
            field = document.getElementById(id) ;
            field.style.background = color ;
        }
    }

    markedrows.sort(numericalorder) ;
}

alert用于调试,它们清楚地显示markedcols确实包含应该有的列,但是indexOf似乎无法捕获它。

据我所知,所有现代浏览器,特别是Firefox,现在都支持数组上的indexOf,所以我完全迷失了方向。我一遍又一遍地阅读代码的逻辑,它应该运行。只是它没有。


1
markedcols是否可能包含字符串而不是数字?它们在alert中显示得很相似。 - pimvdb
@pimvdb 哦,原来如此。我以为JavaScript会自动转换基本类型,但显然在这种情况下不会? - user606547
1个回答

3
我认为你的问题在于:

您的问题可能在于:

["1"].indexOf(1) === -1; // true

因此,您可能需要使用.indexOf(col.toString())

尽管"1" == 1,但.indexOf似乎执行了类似于===的比较。至少是V8这样做的。

编辑:规范确实说明应该使用===

same成为将searchElementelementK应用严格相等比较算法的结果。

如果sametrue,则返回k


谢谢,我觉得我自己永远都不会想到解决这个问题。问题已解决。 - user606547

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接