【问题标题】:length property of Array.prototype object - ES 5Array.prototype 对象的长度属性 - ES 5
【发布时间】:2015-12-05 11:59:52
【问题描述】:

function 类型对象中,length 属性表示function 类型对象预期的参数数量。例如,Function 对象中的 length 字段,Array 对象,在下面的可视化中,具有值 1

在上面的可视化中,length字段也是object类型对象Array.prototype的成员,其值为0

MDN 说:

Array.prototype.length 反映数组中元素的数量。

遵循下面cars & bikes 数组中的定义,

var cars = new Array("Saab", "Volvo", "BMW");
var bikes = ["Honda", "Yamaha"];

cars.__proto__.length & bikes.__proto__.length仍然是0

多个数组对象(carsbikes)不能共享相同的length 属性值,因为length 属性位于Array.prototype

1)

按照MDN,这个定义对吗?

2)

如果不是,Array.prototype 中的 length 字段表示什么?

【问题讨论】:

  • Array.prototype.length 是数组中元素的数量(有点——稀疏数组等等)

标签: javascript javascript-objects ecmascript-5


【解决方案1】:
var cars = new Array("Saab", "Volvo", "BMW"); 
var bikes = ["Honda", "Yamaha"]; 

cars.__proto__.length & bikes.__proto__.length 仍为 0。

是的,但是cars.length === 3bikes.length === 2

cars.__proto__.lengthArray 构造函数的prototype 属性的长度。默认为空数组实例。

详情

Array.prototype 是一个空数组实例。 var cars = new Array() 生成一个对象,其中 __proto__ 指向 Array.prototype。 所以cars.__proto__ === Array.prototype

在数组实例上,length 是 Array 对象上最大整数属性的值加一。如果为空,则为零。

var a = [];
a[10] = 'foo';
a.length; // 11

Array.prototype 为空。

因此

cars.__proto__.length === 0

【讨论】:

  • 1) 我没听明白,当你说,cars.__proto__.lengthArray 构造函数的prototype 属性的长度。 它是做什么的意思是说lengthArray.prototype 属性? #### 2) Array.prototype 为空?这是什么意思?
【解决方案2】:

MDN 说:

Array.prototype.length反映了数组中元素的个数。

这是一个正确的定义吗?

有点,是的。与数组相关的.length 属性共有三种:

  • Array.length。正如你所说,它是所有函数都具有的实例(“自己的”)属性,与数组无关。
  • arr.length,其中arr 是一个数组实例(例如arr = ['ex', 'ample'])。每个数组都有这个special property,它的作用有点像getter/setter,自动确定对象拥有的最高数组索引属性。
  • Array.prototype.length 是 #2 的特例,因为 Array.prototype 本身只是一个数组对象 - 默认为空,因此 .length == 0

MDN 有点不准确,因为它将实例属性与其文档页面中从原型继承的属性混合在一起。正如您的图表正确显示的那样,所有carsbikesArray.prototype 对象都有自己的.length 属性和自己的值(当然,改变一个不会改变其他的)。

那么Array.prototype.length有什么目的呢?实际上并不多,因为它通常被继承自Array.prototype 的数组对象的自身属性所掩盖。因此,除了因为规范说 Array.prototype 是一个数组实例并且具有该属性而存在之外,它还可以作为 normal 上的合理默认 .length 值(非数组)从 Array.prototype 继承的对象 - 不过这种情况非常罕见。

【讨论】:

  • Array.prototype 只是一个数组实例本身?正如answer 所说:*当您在原型上放置一些东西时,对象的每个实例都共享相同的方法代码。* 当您说Array.prototype 是数组实例时,您是什么意思?我不明白这一点。
  • 是的。诚然,一个当然不从自身继承,一个有很多奇怪的属性(所有 Array 方法),但它仍然是一个数组对象,这意味着它具有这个特殊的工作 .length 属性。跨度>
  • Array.prototype 是一个数组对象,意思是它具有.length 属性?很难接受这一点。使用对象文字表示法,如果我说xyz { length : 2 }xyz 是数组对象吗? xyzArray.prototype 都是 object 类型。
  • @overexchange: 只是Array.prototype.length = 1.length++Array.prototype[0] = "something" 等等……Array.prototype 是一个功能齐全的数组!
  • Why Array.prototype is an Array?,基本上答案是“为什么不呢?”。你可能想问问语言设计者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多