前端 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]