您知道在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++)
{
}
答案 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引擎原则上可以实现不同的行为。