Меня немного 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