JavaScript Array.length属性是函数还是简单变量?

时间:2013-01-22 17:28:26

标签: javascript

我有以下JavaScript代码。我使用new关键字初始化了一个数组,因此创建了一个新的数组对象实例。然后我通过向其添加元素来填充数组。

但是我认为我已经犯了一个根本性的误解 - 这是代码的下一部分让我感到非常困惑,请纠正我的术语,如果它不够清楚或者只是完全错误的话。我已记录(beatles.length)。我使用length属性来查找数组中有多少元素。但为什么长度是属性而不是方法呢?

不是长度实际上是Array对象可以调用的返回数值的方法吗?如果length不是方法那么为什么它是属性(属于数组对象的变量)?请以简洁的方式解释这里的区别。

var beatles = new Array();
beatles[0] = "John";
beatles[1] = "Paul";
beatles[2] = "George";
beatles[3] = "Ringo";

console.log(beatles.length);

7 个答案:

答案 0 :(得分:2)

在将元素推送到数组对象时会增加或减少的属性。

例如我的(假)对象:

var myArray = function(){
   this.length = 0;

   this.push = function(itm){
       this.length++; 
       // ^ doesn't do anything aside from increase length
   };
};

答案 1 :(得分:2)

StringArrays都属于Objects类型,并非基本变量类型。

因此,lengthObject通用对象的成员变量,通常可用于Array和String。在String的情况下,它返回字符串长度,在Array的情况下,它通过覆盖返回计数。

一个小例子是:

var a = "Hello";
var b = new Array();
b[0] = "Hello";
b[1] = "World";
a.length    // returns 5
b.length    // returns 2

答案 2 :(得分:2)

.length不需要成为一个函数,因为它不需要每次都重新计算,而是在将元素推送到您的元素时根据需要增加或减少它[]对象。

虽然函数可以幂等,但属性总是幂等,这使.length更适合。

函数通常会更改状态(如.push),或根据收到的参数返回不同的值(.slice.splice)。

另一个注意事项:

初始化数组的首选方法是var a = [];,要添加元素,您应该使用a.push(element);

答案 3 :(得分:1)

在这种情况下,length是一个始终由javascript引擎本身保持有效的属性。

答案 4 :(得分:1)

length是一个伪属性,底层有一些东西让它像它一样工作。

length表现得像一个getter和一个setter在一个(像一个函数)。您可以像属性一样访问它,但不能像属性一样删除它:delete beatles.length(将失败)。

如果向Array添加元素,length属性将相应更改。

如果设置长度属性,则数组将更改 - beatles.length = 0;将清除数组。

现在没有办法自己制作类似的功能(没有使用显式的get / setter)。其中一些将在新的ES5(或6?)标准中提供。就像制作不可变属性的能力一样。索引分配的 magic 将特定于Arrays,这是一种语言功能。

至于为什么语言设计师使它成为属性而不是函数..好吧,也许性能,或许与其他语言相似(当然最着名的是Java)。

来源:

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/get https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/set

答案 5 :(得分:0)

Array.length属性实际上是两个(隐藏)方法的封装,get()set(),也称为访问者。

当您在表达式中使用该属性时,JavaScript会在内部调用get(),例如:

var n = fields.length;

相反,它在作业中使用时调用set(),例如:

fields.length = 1;

这样做也会更新数组项以满足以下条件。

  

length属性的值始终高于最大项目索引(如果没有,则为零);

这是一个重要的细节,因为在某些情况下,它不会严格地与数组中的(非空)项的数量相同。

答案 6 :(得分:0)

这是一个属性,但它与整个语言中的任何其他属性不同

阵列不是完全您熟悉的同类物体(尽管它们确实非常接近)。规范定义了一种特殊类型的对象,称为数组异域对象,只是为了保持length属性的运行方式,并且所有数组实际上都是这种奇特的对象,而不是标准对象。还有其他一些异国情调的物品,但是阵列的那个是我们在这里关注的。

length属性的基础看起来很简单:它是数组中元素的数量。但是保持这种最新状态需要相当多的幕后魔术。即使是吸气剂和制定者也无法完全处理它。

原因来自Array length属性的实际定义:如果查看对象的属性名称,可能会将其中的一些表示为数字,如果可能,则其中一个数字必须大于其他数字。数组异常对象始终具有名为length的属性,并且该属性的值必须始终大于其对象的最大此类数。 如果其他属性发生更改,则阵列length可能也必须更改,具体取决于其他属性的名称。因此,它必须监控所有属性更改,以确保在它应该时更新。

目前,在JavaScript中无法做到这一点。您可以使用setter来监视对特定属性的更改,但是您无法使用常规功能来监视对象上的所有属性更改。通过代理对象, ECMAScript 6看起来有一种方法可以做到这一点,但是还没有任何浏览器完全支持它。