Array.length против arrayinstance.length в JavaScript

Меня немного Array.length свойство Array.length (то есть свойство с именем length для объекта функции Array) и array_instance.length (то есть свойство с именем length в экземпляре объекта массива)

enter image description here

Так в чем же разница между двумя свойствами length и когда мы должны/не должны их использовать?

Изменить 1:

есть также length собственности на Array.prototype объекта. Я так растерялся.

enter image description here

Редактировать 2

Просто, чтобы нарисовать более ясную картину, вот различные свойства length я нашел

enter image description here

Редактировать 3

Это один из последующих вопросов, которые я задал в разделе комментариев, но я думаю, что этот вопрос важен для полного понимания свойства length, поэтому я вставил его в основной раздел

Контрольный вопрос:

Array.prototype.hasOwnProperty('length') и Array_instance.hasOwnProperty('length') возвращают true, означает ли это, что есть два свойства length, одно для array_instance, одно Array.prototype объекта Array.prototype, с array_instance.length Array.prototype.length?

Ответ 1

Я действительно думаю, что многие другие ответы охватили все необходимое здесь, но, поскольку кажется, что у ОП не было того, что они видят в качестве четкого ответа, я попытаюсь изложить все, достаточно подробно - но настолько четко, насколько смогу - чтобы уточнить. (Извиняюсь, если кто-то думает, что я "краду" их ответ - уверяю вас, что это не намерение, и я сознательно не смотрю на них, когда набираю это, но я, конечно, прочитал большинство из них и даже проголосовал за мало.)

Array.length

Это уже было хорошо освещено выше. Array - это встроенная функция JS, которую вы можете использовать для создания массивов. Это реже, чем простое определение литерала массива (и, насколько я знаю, нет причин, по которым это когда-либо будет предпочтительнее), но вместо var a = [1,2,3] вам разрешено сделать это:

var a = Array(1,2,3);
console.log(a);

Ответ 2

функции имеют свойство .length которое соответствует количеству .length аргументов. Например:

const unary = (a) => {

}

const binary = (a, b) => {

}

console.log(unary.length);
console.log(binary.length);

Ответ 3

В первой части уже дан ответ, конструктор Array - это функция, а функции имеют свойство .length.

Во-вторых, Array.prototype.length немного более непонятно...

Array.prototype на самом деле является массивом:

console.log(Array.isArray(Array.prototype)); // true
Array.prototype.push('hello'); 
console.log(Array.prototype.length); // 1
console.log(Array.prototype[0]); // "hello"

Ответ 4

Отказ от ответственности: я попытался показать, как работает конструктор и экземпляр в целом. Но на самом деле они имеют огромную разницу между разными конструкторами.

У любого конструктора была установлена его длина со значением, указанным в спецификации. Специально для большинства из них установлено значение 1:

Number.length // 1
Object.length // 1
Function.length // 1
Array.length // 1
// etc.

Так же,

Array.constructor.length // 1
// etc.

Как указано в комментарии @Kaiido, вы можете видеть, что установлена некоторая длина конструктора:

Document.length // 0
Int8Array.length // 3
Date.length // 7 

И вы также можете заметить, что длина экземпляра не undefined как они не установлены. - Это выходит за рамки, хотя.

let d = new Date
d.length === undefined // true

Смотрите внизу для соответствующих ссылок.

Но когда у вас есть экземпляр этого, вы создаете новое значение этого:

typeof new Array === typeof Array.prototype // true
typeof new Function === typeof Function.prototype // true
// etc.

Итак, когда вы используете экземпляр, он не имеет значения длины, потому что у него нет никаких параметров:

let arr = new Array // Array.prototype
arr.length === 0 // true

Но когда вы используете экземпляр с параметром, то у вас есть свойство length со значением параметров

let arr = new Array(20)
arr.length === 20 // true
let func = function(a1,a2,a3,a4){}
func.length === 4 // true
// etc.

Итак, теперь вы задаетесь вопросом, почему конструктор имеет значение длины, равное 1?

Это потому, что спецификация изначально установила значение равным 1.

Каждый встроенный объект Function, включая конструкторы, имеет свойство length, значением которого является целое число. Если не указано иное, это значение равно наибольшему числу именованных аргументов, показанных в заголовках подпунктов для описания функции, включая необязательные параметры.

Значением внутреннего слота [[Prototype]] конструктора Object является внутренний объект% FunctionPrototype%.

Помимо свойства длины (значение которого равно 1),

Смотрите эти ссылки:

Стандартные встроенные объекты,

19.1.2 Свойства конструктора объекта,

19.2.2 Свойства конструктора функций,

и т.п.

Также вы можете видеть, что прототип имеет длину до 0, вы уже знаете, почему в предыдущем примере.

Хотя, здесь просто ссылка, в которой говорится:

19.2.3 Свойства объекта-прототипа функции

И есть какой-то конструктор, длина которого задается иначе. Это выходит за рамки этого ответа. Хотя здесь ссылка на конструктор даты:

20.3.3. Свойства конструктора даты

Таким образом, это полностью зависит от спецификации, как они были определены.

Ответ 5

Array.length

Array является конструктором, что означает, что его тип является "function". Вы пытаетесь проверить это консоль.

typeof Array //"function"

По данным МДН

Свойство length указывает количество параметров, ожидаемых function.

Поскольку функция Array ожидает один аргумент, Array.length = 0

array_instance.length

Свойство length объекта, который является экземпляром типа Array устанавливает или возвращает количество элементов в этом массиве.

Как мы знаем, массивы на самом деле являются объектами, поэтому объекты могут иметь свойства. Свойство length находится на экземпляре массива.
Теперь второй вопрос, который вы можете задать, почему мы не получаем свойства length массива с помощью Object.keys или цикла for..in. Ответ в том, что это свойство не Enumerable.

let arr= [];

//this.property 'length2' will not be shown in for..in or Object.keys();
Object.defineProperty(arr,'length2',{
  value:'length2 for test',
  enumerable:false
})

//this property 'x' will be displayed in for..in loop and Object.keys()
Object.defineProperty(arr,'x',{
  value:'length2 for test',
  enumerable:true
})


console.log(Object.keys(arr)); //["x"]

Ответ 6

Array.length Для количества свойств в массиве или свойства length объекта, который является instance of type Array устанавливает или возвращает количество элементов в этом массиве.

Array.prototype.length Унаследованное количество свойств в массиве. Когда вы проверяете Array.length вы фактически проверяете Array.prototype.length