数组的长度是否缓存?

在JS中,缓存数组的长度还是取决于不同的引擎/浏览器?

通常我会假设浏览器的JS引擎非常笨,并缓存数组的长度,例如:

var a   = [ ];
var l   = l;

function arrayPush(i)
{
    l   = a.push( i );
}

function arrayPop()
{
    var r   = a.pop();

    l   = a.length;

    return r;
}

(作为一个简单的例子,当然,复制每个数组函数都是愚蠢的,但如果它加快速度,那么它是值得的)


数组长度被缓存。 每次操作数组时都更新它。


在数组上调用.push()方法时,数组长度在算法的第6步中更新:

使用参数“length”,n和true调用O的[[Put]]内部方法。

资料来源:http://es5.github.com/x15.4.html#x15.4.4.7


当您调用数组的.pop()方法时,数组长度在算法的步骤5.d中更新:

使用参数“length”,indx和true调用O的[[Put]]内部方法。

资料来源:http://es5.github.com/x15.4.html#x15.4.4.6


当您在给定索引处为数组赋值时,会调用[[DefineOwnProperty]]内部方法。 数组长度在算法的步骤4.e.ii中更新:

在A上传递默认[[DefineOwnProperty]]内部方法(8.12.9),传递“length”,oldLenDesc和false作为参数。 此调用将始终返回true。

资料来源:http://es5.github.com/x15.4.html#x15.4.5.1


正如在这个答案中详细阐述的那样,现代浏览器将拥有JS引擎,它将非常明智地处理Array.length

如果你担心在较小的JS引擎上的性能,你可以缓存它,如果它将被重复使用,例如在循环停止条件下使用。

for (var i = 0, arrLength = arr.length; i < arrLength; i++) { }

如果你需要保持自己的长度值(如你的例子),这不太可能会很慢。 这不太可能会给您带来明显的性能提升,但会使您的代码更易于维护,并且更容易受到漏洞的影响。


这取决于实现,但一个理智的浏览器应该简单地维护一个计数器。 如果这是一个非常糟糕的实现,它可能需要遍历数据结构或其他东西来获取大小。

通常你会这样做:

add(obj)
{
    buffer[ptr++] = obj;
}

getLength()
{
    return ptr;
}

当缓冲区为空时, ptr为0.添加一个对象将其插入buffer[0]并将ptr增加1,该长度也会返回1。 这意味着当你想要长度时,不需要进行任何形式的“计数”操作。

链接地址: http://www.djcxy.com/p/70007.html

上一篇: Is the length of an array cached?

下一篇: set length to variable or calculate length within loop statment