春光十里哥 发表于 2024-6-28 05:35:39

前端 Array.sort() 源码学习

源码地址

V8源码Array
710行开始为sort()相关
Array.sort()方法是那种排序呢?

去看源码主要是源于这个问题
// In-place QuickSort algorithm.
// For short (length <= 22) arrays, insertion sort is used for efficiency.这块代码是对于非数组的一个处理
注释里面说到
// 通常使用快速排序算法
// 如果数组长度小于23,则插入排序效率更好返回的max会在下面用到
第五块代码

if (!IS_CALLABLE(comparefn)) {
comparefn = function (x, y) {
    if (x === y) return 0;
    if (%_IsSmi(x) && %_IsSmi(y)) {
      return %SmiLexicographicCompare(x, y);
    }
    x = TO_STRING(x);
    y = TO_STRING(y);
    if (x == y) return 0;
    else return x < y ? -1 : 1;
};
}注释翻译:
// Smi:小整数(Small integers)V8引擎中的元素类型之一
`https://medium.com/@justjavac/v8-internals-how-small-is-a-small-integer-ba5e17a3ae5f`
// PS: markdown语法有问题,这里直接贴出 url可能因为英语语法水平不够,单看注释还有点不明白
大致意思是,把“掀开的东西,再盖上”
直接看下面一块代码,看看这个shadow操作到底干了啥叭
第六块代码

// Set a value of "undefined" on all indices in the range from..to// where a prototype of obj has an element. I.e., shadow all prototype// elements in that range.var ShadowPrototypeElements = function(obj, from, to) {for (var proto = %object_get_prototype_of(obj); proto;      proto = %object_get_prototype_of(proto)) {      var indices = IS_PROXY(proto) ? to : %GetArrayKeys(proto, to);      if (IS_NUMBER(indices)) {          // It's an interval.          var proto_length = indices;          for (var i = from; i < proto_length; i++) {            if (HAS_OWN_PROPERTY(proto, i)) {            obj = UNDEFINED;            }          }      }         else {            for (var i = 0; i < indices.length; i++) {                var index = indices;                if (from
页: [1]
查看完整版本: 前端 Array.sort() 源码学习