Javascript Array.length是一个属性而不是一个方法,但是.length如何像方法一样工作?

Javascript Array.length是一个属性而不是一个方法,但是.length如何像方法一样工作?,javascript,Javascript,方法可以使用该方法的逻辑从数组中获取值。但是length不是数组的一个方法,尽管在编写array.length时会返回一个值,但如何 “我是怎么知道的。长度是数组的属性?是‘当我们调用方法时,我们都知道一个方法应该具有(),但是.length不使用()调用。所以它是对象的属性’” max()正在返回一个值,因为它是methode 作为属性,.length如何返回值?正式调用数组。您看到的这种非常奇怪的行为,对象属性显然会自动更改,在普通Javascript对象上是不可见的(或不可能实现的): 本

方法可以使用该方法的逻辑从数组中获取值。但是length不是数组的一个方法,尽管在编写array.length时会返回一个值,但如何

“我是怎么知道的。长度是数组的属性?是‘当我们调用方法时,我们都知道一个方法应该具有
()
,但是.length不使用
()
调用。所以它是对象的属性’”

max()正在返回一个值,因为它是methode


作为属性,.length如何返回值?

正式调用数组。您看到的这种非常奇怪的行为,对象属性显然会自动更改,在普通Javascript对象上是不可见的(或不可能实现的):

本规范定义了几种内置的外来对象。这些对象的行为通常与普通对象相似,但有一些特定情况除外。以下外来对象使用普通对象内部方法,除非下面另有明确规定:

数组对象是对数组索引属性键进行特殊处理的外来对象(请参见6.1.7)。属性名为数组索引的属性也称为元素。每个数组对象都有一个长度属性,其值总是小于232的非负整数。length属性的值在数字上大于名称为数组索引的每个自有属性的名称;每当创建或更改数组对象的自有属性时,都会根据需要调整其他属性以保持此不变具体而言,每当添加名称为数组索引的自有属性时,如果需要,长度属性的值将更改为比该数组索引的数值多一个;并且,每当更改长度属性的值时,名称为数组索引且其值不小于新长度的每个自有属性都将被删除。此约束仅适用于数组对象的自有属性,并且不受从其原型继承的长度或数组索引属性的影响

换句话说,数组的
.length
是对象属性本身不改变的一般规则的一个特殊例外

请注意,getter可以具有类似的功能:

const obj={
获取长度(){
返回Object.keys(this)
.filter(键=>/^[0-9]+$/.test(键))
.长度;
}
};
obj[0]='x';
obj[1]=“y”;

控制台日志(对象长度)好问题。这里唯一的问题是,您认为
Array.length
是在调用此属性时计算出来的。不,不是这样的

创建数组时,将设置其属性。这些属性(如长度、原型函数等)在创建数组时包含一个值。当您执行
Array.length
时,您只获得该属性的值。对于函数,在调用调用时执行代码

将其视为数组定义中的构造函数,它在创建和修改
Array
类的对象时设置属性
length

作为数组类型实例的对象的长度属性 设置或返回该数组中的元素数。该值是一个 无符号32位整数,在数值上始终大于 数组中的最高索引

如上所述,您还可以使用它来设置元素的数量。理论上,这是可以通过使用getter和setter实现的

下面的示例设置对象的
latest
属性,该属性将表示内部数组的最后一个元素

var obj={
日志:['a','b','c'],
获取最新信息{
if(this.log.length==0){
返回未定义;
}
返回this.log[this.log.length-1];
},
设置最新值(val){
this.log[this.log.length-1]=val;
}
}
obj.latest='z';

控制台日志(对象最新版本)您可以获取一个属性并从中赋值或获取一个值,但它是Iomplements as and。这允许将函数用作简单属性,并使用指定的值更改其他内容,如删除项

var对象={
l:42,
get length(){返回this.l;},
设置长度(l){this.l=l;},
}
console.log(object.length);
object.length=2;

console.log(object.length)属性在访问时返回其值。这有什么不寻常的<代码>常量obj={x:1};console.log(obj.x);//也不是x()
为什么您认为该属性首先不能返回值?您还可以指定给length。因此,
arr.length=0
是清除数组的另一种方法。意思是长度不是一个只获取的属性。长度是数组类型实例的对象的属性。对象具有属性,该属性跟踪长度(大部分情况下自动)。因此,length就像一个对象键,当你调用它时,它将返回它的值。length是数组的一个属性,不是一个方法,如果它是一个方法,那么数组的长度将是O(n),而是通过将它作为属性保留为O(1)。“一旦创建了数组类的对象。”并修改
var arr = [1,2,3,8,6,4,9,5,8,6];
console.log(arr.length); //10 - 
console.log(Math.max(...arr)); //9