当前位置: 首页 > 面试题库 >

Array.sort()方法在不同浏览器中的稳定性如何?

盛琪
2023-03-14
问题内容

我知道ECMA脚本规范没有指定用于数组排序的算法,也没有指定排序是否稳定。

我已经找到了有关Firefox的信息,该信息指定Firefox使用稳定的排序。

有谁知道IE 6/7/8,Chrome和Safari?


问题答案:

从ES2019开始,sort要求保持稳定。从ES2018到ECMAScript 1st Edition,它被允许不稳定。

简单的测试用例忽略标题,如果引擎的排序是稳定的,第二组数字应该是连续的。注意:此测试用例不适用于某些版本的Chrome(从技术上来说是V8),该版本基于数组的大小切换排序算法,对小型数组使用稳定的排序,对较大数组使用不稳定的排序。详细信息。)请参阅问题结尾,以获取使数组足够大以触发行为的修改版本。

IE的排序一直稳定,只要我曾经使用过(即IE6)。再次检查IE8,看来仍然如此。

尽管您链接到的Mozilla页面说的是Firefox的排序是稳定的,但我肯定会说,在Firefox 2.0(包括Firefox
2.0)之前,情况并非总是如此。

一些粗略的结果:

  • IE6 +: 稳定
  • Firefox <3:不稳定
  • Firefox> = 3: 稳定
  • 铬<70:不稳定
  • Chrome> = 70: 稳定
  • Opera <10:不稳定
  • Opera> = 10: 稳定
  • Safari 4: 稳定
  • 边缘:对于长数组> 512个元素)不稳定

Windows上的所有测试。

另请参阅:

这个测试用例(从此处进行修改)将通过确保数组具有足够的条目来选择“更有效”的排序方法来演示V8(例如Node
v6,Chrome <v70)中的问题;这是在考虑非常老的JavaScript引擎的情况下编写的,因此没有现代功能:

function Pair(_x, _y) {

    this.x = _x;

    this.y = _y;

}

function pairSort(a, b) {

    return a.x - b.x;

}

var y = 0;

var check = [];

while (check.length < 100) {

    check.push(new Pair(Math.floor(Math.random() * 3) + 1, ++y));

}

check.sort(pairSort);

var min = {};

var issues = 0;

for (var i = 0; i < check.length; ++i) {

    var entry = check[i];

    var found = min[entry.x];

    if (found) {

        if (found.y > entry.y) {

            console.log("Unstable at " + found.i + ": " + found.y + " > " + entry.y);

            ++issues;

        }

    } else {

        min[entry.x] = {x: entry.x, y: entry.y, i: i};

    }

}

if (!issues) {

    console.log("Sort appears to be stable");

}


 类似资料:
  • 我有相同的图像和相同大小的画布,但是输出是不同的。我想要同样的输出,该怎么做呢?

  • 我需要一张图片来填充分区。根据这个答案,工作几乎完成了。当图像略大于其所包含的div时,就会出现问题。图像以100%的比例显示,这在我的情况下并不理想。 在Firefox中,这个问题可以通过使用以下CSS来解决: 在其他浏览器(使用Chrome和Edge测试)中,此解决方案不起作用,最终结果与以前相同。 有没有办法在其他浏览器上实现与Firefox相同的结果? 这是一个摆弄模型布局的摆弄,展示了这

  • 问题内容: 在我的settings.txt文件中,我有一个名为{BROWSER}的变量,并且关联值如上所示,它是firefox 但是我想要的是 像上面的东西…所以当我首先运行测试套件时,它将在firefox中运行,并且在完成所有测试用例之后,它将关闭firefox,将打开chrome并在chrome浏览器上再次运行所有测试用例..依此类推它将在IE上运行 那么我们该怎么做呢? 我不想手动进行操作(

  • 我正尝试在不同的浏览器驱动中运行Fluentlenium。我想我需要从Fluentlenium配置getDefaultDriver(),但是我不确定该怎么做。任何示例代码将是伟大的。这是我的代码,但它不起作用。我在Eclipse中得到的消息是: “java.lang.IllegalStateException:驱动程序可执行文件的路径必须由webdriver.chrome.driver系统属性设置

  • 我用Java创建了一个简单的Cumber测试。基本上,当您运行功能文件时,它会转到一个网站,选择一个按钮并将您带到该页面。我想做的是通过BrowserStack运行这个测试。不仅如此,还可以在Browserstack中的多个浏览器/设备上并行运行此单一功能文件。e、 g在五个不同的浏览器/设备上运行相同的测试。

  • 问题内容: 在IE7,IE8和Firefox上设置属性并返回不同的值: IE 8: IE 7: 火狐: 为什么存在这种差异? 在不使用jQuery的情况下,是否存在跨不同浏览器(IE8,IE7,Firefox)一致的等效属性? 问题答案: 这与浏览器的盒子模型有关。使用jQuery或其他JavaScript抽象库之类的东西来规范DOM模型。