Array.prototype对象的长度属性 - ES 5

时间:2015-12-05 11:59:52

标签: javascript javascript-objects ecmascript-5

<Grid> <Grid.Resources> <FrameworkElement x:Key="ProxyElement" DataContext="{Binding}"/> </Grid.Resources> <ContentControl Visibility="Collapsed" Content="{StaticResource ProxyElement}"></ContentControl> <DataGrid x:Name="datagrid" Grid.Row="1" AutoGenerateColumns="False" ItemsSource="{Binding Alvm.Artists}"> <DataGrid.Columns> <DataGridTextColumn Header="ID" IsReadOnly="True" Binding="{Binding Id}" /> <DataGridTextColumn Header="Name" Binding="{Binding Name}" /> <DataGridTextColumn Header="Email" Binding="{Binding Email}" /> <DataGridComboBoxColumn Header="Category" SelectedItemBinding="{Binding Category}" ItemsSource="{Binding DataContext.Clvm.Categories, Source={StaticResource ProxyElement}}" /> </DataGrid.Columns> </DataGrid> </Grid> 类型对象中,float: left;属性表示function类型对象所期望的参数数。例如,以下可视化中的length对象function对象中的length字段的值为Function

enter image description here

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

MDN说:

  

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

在以下0&amp; Array.prototype.length数组,

cars

bikes&amp; var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"]; 仍为cars.__proto__.length

多个数组对象(bikes.__proto__.length0)无法共享cars属性值,而bikes属性位于length

1)

根据MDN,这是正确的定义吗?

2)

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

2 个答案:

答案 0 :(得分:3)

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

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

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

cars.__proto__.lengthprototype构造函数的Array属性的长度。默认情况下,这是一个空数组实例。

<强>详情

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

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

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

Array.prototype为空。

因此

cars.__proto__.length === 0

答案 1 :(得分:1)

  MDN说:

     
    

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

  
     

这是一个正确的定义吗?

Sorta,是的。与数组相关的属性有三种.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继承的非数组对象 - 但这些情况非常罕见。