Array.size () против Array.length

385

Какая разница между двумя?

Так что я знаю, что array.size()это функция, а array.lengthсвойство. Есть ли вариант использования одного над другим? Еще один эффективный? (Я полагаю, .lengthчто он будет значительно быстрее, поскольку это свойство, а не вызов метода?) Почему кто-то когда-либо использовал более медленный вариант? Существуют ли браузеры, несовместимые с одним или другим?

  var x = [];
  console.log(x.size());
  console.log(x.length);
  console.log(x.size()==x.length);
  x =[1,2,3];
  console.log(x.size());
  console.log(x.length);
  console.log(x.size()==x.length);

Распечатает:

  0, 0, true
  3, 3, true
Авраам П
источник
63
Где вы нашли Array.size()метод в родном JavaScript?
VisioN
2
Chrome не имеет .size...
0x499602D2
1
@AbrahamP idk, какую консоль Chrome вы используете ...
Нафтали или Нил
3
.size()скорее всего из фреймворка Prototype: prototypejs.org/doc/latest/language/Array/prototype/size
MikeM

Ответы:

535

Array.size () не является допустимым методом

Всегда используйте свойство длины

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

К сожалению, Underscore.js определяет sizeметод, который на самом деле возвращает длину объекта или массива. Поскольку, к сожалению, свойство length функции определяется как число именованных аргументов, функция объявляет, что им пришлось использовать альтернативу, и был выбран размер (count был бы лучшим выбором).

Габриель
источник
154

.size()это не родная функция JS из Array(по крайней мере , не в любом браузере , который я знаю).

.length следует использовать.


Если

.size() действительно работает на вашей странице, убедитесь, что у вас нет дополнительных библиотек, таких как прототип, который смешивается сArrayпрототипом.

или

В вашем браузере может быть какой-то плагин, который смешивается с Arrayпрототипом.

Нафтали ака Нил
источник
@BartFriederichs хорошо, я в Chrome, но это полезно знать :-D
Нафтали, он же Нил,
Он работает в Chrome, не работает в Firefox, я склонен использовать Chrome для отладки, чтобы он работал. Спасибо за указание на его отсутствие.
Авраам П
9
Если он работает в Chrome, возможно, на вашей странице есть какая-то дополнительная библиотека, которую вы вызываете, которая добавляет ее в прототип Array.
Спайк Уильямс
1
Версия 23.0.1271.97 [] .size function size () {return this.length;} Так что на самом деле это всего лишь обертка вокруг .length ... Я сейчас чувствую себя глупо ...
Abraham P
2
@AbrahamP, нажмите F12 на ЭТОЙ странице и введите [].sizeв консоли. Если это работает, то у вас есть какой-то плагин Chrome, который смешивается с прототипом Array, и я бы волновался. :)
Aquinas
30

.size()Функция доступна в Jquery и многих других библиотек.

.lengthСвойство работает только тогда , когда индекс является целым числом.

lengthСвойство будет работать с этим типом массива:

var nums = new Array();
nums[0] = 1; 
nums[1] = 2;
print(nums.length); // displays 2

lengthСвойство не будет работать с этим типом массива:

var pbook = new Array(); 
pbook["David"] = 1; 
pbook["Jennifer"] = 2;
print(pbook.length); // displays 0

Так что в вашем случае вы должны использовать .lengthсобственность.

Саурабх Чандра Патель
источник
Есть ли что-то, что работает со строками, если размер не работает?
Крис
2
@Chris для массивов со строковыми ключами, как, например, pbookвыше, вы можете использовать $(pbook).size();[требует jQuery]
неприятное
3
Зачем тебе ставить два пробела везде?
Сообщение Self
19

.size() это jQuery, скорее всего, вы либо запутались, либо взяли у кого-то еще, кто импортировал библиотеку jQuery в его проект.

Если вы импортируете jQuery и будете писать как $(array).size(), он вернет длину массива.

Хулио Флорес
источник
1
Многие библиотеки используют .size()это не только jquery
Нафтали ака Нил
15

array.length не обязательно количество элементов в массиве:

var a = ['car1', 'car2', 'car3'];
a[100] = 'car100';
a.length; // 101

Длина массива на один больше, чем самый высокий индекс.

Как указано выше Array.size(), не является допустимым методом.

Больше информации

user2811108
источник
На практике это количество предметов. Большинство интерпретаторов JS заполняют строки массива неопределенными. В вашем примере у вас будет 101 элемент в вашем массиве с 97 элементами без значения (не определено), но элементы есть. Это будет выглядеть так: ['car1', 'car2', 'car3', undefined * 97, 'car100'] Если вы зациклите этот массив, ваша переменная приращения будет иметь значение 101 после цикла.
ElJackiste
С другой стороны, array.length не обязательно является числом определенного (не назначенного) значения в массиве.
ElJackiste
4

Свойство length возвращает (last_key + 1) для массивов с числовыми ключами:

var  nums  =  new  Array ();
nums [ 10 ]  =  10 ; 
nums [ 11 ]  =  11 ;
log.info( nums.length );

напечатает 12!

Это будет работать:

var  nums  =  new  Array ();
nums [ 10 ]  =  10 ; 
nums [ 11 ]  =  11 ;
nums [ 12 ]  =  12 ;
log.info( nums.length + '  /  '+ Object.keys(nums).length );
cskwg
источник
Хотя это интересный ответ, я не совсем уверен, что это ответ на этот вопрос
OliverRadini
ОП спрашивал «Array.size () vs Array.length». Из предыдущих обсуждений стало ясно, что функция «size» не является частью стандартного JavaScript, а реализуется библиотеками. Итак, я предполагаю, что OP заинтересован в том, как получить реальную длину массивов JavaScript. Я раскрываю малоизвестную «особенность» JavaScript, которая может привести к неожиданному поведению, тем более что поведение отличается, когда массив содержит другие типы объектов, например, строки.
cskwg
3

Начиная с версии jQuery 1.8 метод .size () устарел. Вместо этого используйте свойство .length

Смотрите: https://api.jquery.com/size/

Дэви
источник
2

Размер обнаруживает дубликаты, он возвращает количество уникальных значений

const set1 = new Set([1, 2, 3, 4, 5, 5, 5, 6]);
console.log(set1.size);
// expected output: 6
оборот
источник
1

На самом деле, .size()это не чистый метод JavaScript, есть сбруя свойство .sizeиз Set объекта , который немного смахивает , .size()но это не метод функции, так же , как я уже сказал, это сбруя свойство Set объекта , чтобы показать уникальный номер (уникальные) элементы в объекте Set.

Свойство size accessor возвращает количество (уникальных) элементов в объекте Set.

const set1 = new Set();
const object1 = new Object();

set1.add(42);
set1.add('forty two');
set1.add('forty two');
set1.add(object1);

console.log(set1.size);
// expected output: 3

И lengthявляется свойством итерируемого объекта (массива), который возвращает количество элементов в этом массиве. Значение представляет собой 32-разрядное целое число без знака, которое всегда численно больше самого высокого индекса в массиве.

const clothing = ['shoes', 'shirts', 'socks', 'sweaters'];

console.log(clothing.length);
// expected output: 4
AmerllicA
источник
0

мы можем использовать свойство .length для установки или возврата количества элементов в массиве. возвращаемое значение является числом

> set the length: let count = myArray.length;
> return lengthof an array : myArray.length

мы можем вам .size в случае, если нам нужно отфильтровать повторяющиеся значения и получить количество элементов в наборе.

const set = new set([1,1,2,1]); 
 console.log(set.size) ;`
Сунали Бандара
источник