Javascript如何实现`length`

时间:2014-11-15 08:01:24

标签: javascript

您知道在Javascript中,您可以访问具有length属性的文本/数组的长度:

var obj = ["Robert", "Smith", "John", "Mary", "Susan"];

// obj.length returns 5;

我想知道这是如何实现的。 Javascript在调用时是否计算长度属性?或者它只是一个静态属性,每当更改数组时都会更改。我的问题是由于javascript的最佳实践中存在以下混淆:

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

}

我的问题:如果它是一个静态属性,那么在每次迭代中访问length属性都无需担心,但如果在每次迭代时计算它,那么它会花费一些内存。 / p>

我已经阅读了ECMAScript给出的以下定义,但它没有提供任何有关如何实现的线索。我担心它可能会给出一个完整的数组实例,其长度属性是在运行时计算的,如果结果为真,那么上面的for()对内存是危险的,而应该使用以下内容:

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

}

3 个答案:

答案 0 :(得分:3)

JavaScript中的数组不是真正的数组类型,但它是真正的对象类型。

[]。长度不会每次重新计算,由++--运营商操作。

请参阅以下示例,其行为与array.length属性相同。

var ArrayLike = {
    length: 0,
    push: function(val){
        this[this.length] = val;
        this.length++;
    },
    pop: function(){
        delete this[this.length-1];
        this.length--;
    },
    display: function(){
        for(var i = 0; i < this.length; i++){
            console.log(this[i]);
        }
    }
}

// output
ArrayLike.length // length == 0
ArrayLike.push('value1') // length == 1
ArrayLike.push('value2') // length == 2
ArrayLike.push('value3') // length == 3
ArrayLike.pop() // length == 2
ArrayLike.length === 2 // true

答案 1 :(得分:0)

var a = ["abc","def"];

a["pqr"] = "hello";

什么是a.length?

2

为什么?

仅当数组的索引是数值时才更新a.length。当你写

var a = ["abc","def"];

内部存储为:

a["0"] = "abc"

a["1"] = "def"

请注意,索引实际上是字符串键。

更多例子:

1)

var a = ["abc","def"];

a["1001"] = "hello";

什么是a.length?

1002

2.)好的,让我们再试一次:

var a = ["abc","def"];

a[1001] = "hello";

什么是a.length?

1002

请注意,内部数组存储为

a["0"] = "abc"

a["1"] = "def"

a["1001"] = "hello"

3.)好的,最后一个:

var a = ["abc"];

a["0"] = "hello";

什么是[0]?

   "hello"

什么是a.length?

1

很高兴知道a.length实际意味着什么:现在你知道了:a.length比数组中最后一个数字键多一个。

答案 2 :(得分:0)

  

我想知道这是如何实现的。 Javascript在调用时是否计算长度属性?或者它只是一个静态属性,每当更改数组时都会更改。

实际上,你的问题一般都无法回答,因为所有ECMA specs都是这样说的:

  

此Array对象的length属性是一个数据属性   值总是在数值上大于每个可删除的名称   名称为数组索引的属性。

换句话说,规范定义了length属性的不变条件,但不是它的实现。这意味着不同的JavaScript引擎原则上可以实现不同的行为。