我有以下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);
答案 0 :(得分:2)
是在将元素推送到数组对象时会增加或减少的属性。
例如我的(假)对象:
var myArray = function(){
this.length = 0;
this.push = function(itm){
this.length++;
// ^ doesn't do anything aside from increase length
};
};
答案 1 :(得分:2)
String
和Arrays
都属于Objects
类型,并非基本变量类型。
因此,length
是Object
通用对象的成员变量,通常可用于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看起来有一种方法可以做到这一点,但是还没有任何浏览器完全支持它。