Array.size () vs Array.length

385

Jaka jest różnica między nimi?

Wiem więc, że array.size()funkcja array.lengthjest właściwością. Czy istnieje przypadek użycia jednego nad drugim? Czy jeden jest bardziej wydajny? (Wyobrażam sobie, .lengthże byłoby znacznie szybsze, ponieważ jest to właściwość, a nie wywołanie metody?) Dlaczego miałoby się używać wolniejszej opcji? Czy są jakieś przeglądarki, które nie są kompatybilne z jedną czy drugą?

  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);

Wydrukuje:

  0, 0, true
  3, 3, true
Abraham P.
źródło
63
Gdzie znalazłeś Array.size()metodę w natywnym JavaScript?
VisioN
2
Chrome nie ma .size...
0x499602D2
1
@AbrahamP idk jakiej konsoli Chrome używasz ...
Naftali alias Neal
3
.size()prawdopodobnie pochodzi z frameworka Prototype: prototypejs.org/doc/latest/language/Array/prototype/size
MikeM

Odpowiedzi:

535

Array.size () nie jest prawidłową metodą

Zawsze używaj właściwości length

Istnieje biblioteka lub skrypt dodający metodę size do prototypu tablicy, ponieważ nie jest to natywna metoda tablicy. Zwykle robi się to, aby dodać obsługę niestandardowego programu pobierającego. Przykładem użycia tego byłoby, gdy chcesz uzyskać rozmiar w pamięci tablicy (co jest jedyną rzeczą, o której mogę pomyśleć, że byłoby przydatne dla tej nazwy).

Underscore.js niestety definiuje sizemetodę, która faktycznie zwraca długość obiektu lub tablicy. Ponieważ niestety właściwość length funkcji jest zdefiniowana jako liczba nazwanych argumentów, funkcja deklaruje, że musiała użyć alternatywy i wybrano rozmiar (liczba byłaby lepszym wyborem).

Gabriel
źródło
154

.size() jest nie rodem z funkcji JS Array(przynajmniej nie w każdej przeglądarce, które znam).

.length należy użyć.


Gdyby

.size() ma pracę na swojej stronie, upewnij się, że nie posiada żadnych dodatkowych bibliotek zawarta podobnie pierwowzór , który jest mucking z Arrayprototypem.

lub

W przeglądarce może znajdować się wtyczka, która psuje Arrayprototyp.

Naftali alias Neal
źródło
@BartFriederichs dobrze Jestem w Chrome, ale to dobrze wiedzieć :-D
Naftali alias Neal
Działa w Chrome, nie działa w Firefoksie, używam Chrome do debugowania, więc wydaje się, że działa. Dzięki za zwrócenie uwagi na jego nieistnienie.
Abraham P
9
Jeśli działa w Chrome dla Ciebie, prawdopodobnie na twojej stronie wywołujesz dodatkową bibliotekę, która dodaje ją do prototypu Array.
Spike Williams
1
Wersja 23.0.1271.97 [] .size function size () {return this.length;} Więc tak naprawdę to tylko opakowanie wokół .length ... Czuję się teraz trochę głupio ...
Abraham P
2
@AbrahamP, naciśnij F12 na TEJ stronie i wpisz [].sizew konsoli. Jeśli to działa, masz jakąś wtyczkę Chrome, która jest zepsuta prototypem Array, i byłbym zmartwiony. :)
Aquinas
30

Ta .size()funkcja jest dostępna w Jquery i wielu innych bibliotekach.

The .lengthWłasność działa tylko wtedy, gdy indeks jest liczbą całkowitą.

lengthNieruchomość będzie pracować z tego typu tablicy:

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

lengthNieruchomość nie będzie pracować z tego typu tablicy:

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

Więc w twoim przypadku powinieneś korzystać z tej .lengthwłaściwości.

Saurabh Chandra Patel
źródło
Czy istnieje coś, co działa z ciągami, jeśli rozmiar nie działa?
Chris
2
@Chris dla tablic z kluczami ciągów, takich jak pbookpowyżej, możesz użyć $(pbook).size();[wymaga jQuery]
paskudny pasty
3
Dlaczego jednak miałbyś umieszczać wszędzie dwie spacje?
Post Self
19

.size() należy do jQuery, prawdopodobnie jesteś albo mylony z kimś innym, kto zaimportował bibliotekę jQuery do swojego projektu.

Jeśli zaimportujesz jQuery i napiszesz $(array).size(), zwróci długość tablicy.

Julio Flores
źródło
1
Wiele bibliotek korzysta z .size()niego nie tylko jquery
Naftali alias Neal
15

array.length niekoniecznie liczba elementów w tablicy:

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

Długość tablicy jest o jeden większa niż najwyższy indeks.

Jak wspomniano wcześniej, Array.size()nie jest to poprawna metoda.

Więcej informacji

użytkownik 2811108
źródło
W praktyce jest to liczba przedmiotów. Większość interpretatorów JS wypełni wiersze tablic niezdefiniowanymi. W twoim przykładzie będziesz mieć 101 elementów w tablicy z 97 elementami bez wartości (niezdefiniowana), ale elementy tam są. Będzie to wyglądało następująco: [„car1”, „car2”, „car3”, undefined * 97, „car100”] Jeśli zapętlisz tę tablicę, twoja zmienna przyrostowa będzie miała wartość 101 po pętli.
ElJackiste
Z drugiej strony, array.length niekoniecznie jest liczbą zdefiniowanych (nieprzypisanych) wartości w tablicy.
ElJackiste
4

Właściwość „length” zwraca (last_key + 1) dla tablic z klawiszami numerycznymi:

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

wydrukuje 12!

To zadziała:

var  nums  =  new  Array ();
nums [ 10 ]  =  10 ; 
nums [ 11 ]  =  11 ;
nums [ 12 ]  =  12 ;
log.info( nums.length + '  /  '+ Object.keys(nums).length );
cskwg
źródło
Chociaż jest to interesująca odpowiedź, nie jestem całkowicie pewien, czy jest to odpowiedź na to pytanie
OliverRadini
OP zapytał „Array.size () vs Array.length”. Z poprzednich dyskusji jasno wynikało, że funkcja „size” nie jest częścią standardowego JavaScript, ale jest implementowana przez biblioteki. Zakładam więc, że OP jest zainteresowany tym, jak odzyskać rzeczywistą długość tablic JavaScript. Odkrywam mało znaną „funkcję” JavaScript, która może prowadzić do nieoczekiwanego zachowania, zwłaszcza że zachowanie jest inne, gdy tablica zawiera inne typy obiektów, na przykład ciągi znaków.
cskwg
2

Rozmiar wykrywa duplikaty, zwraca liczbę unikalnych wartości

const set1 = new Set([1, 2, 3, 4, 5, 5, 5, 6]);
console.log(set1.size);
// expected output: 6
obrót silnika
źródło
1

Właściwie, .size()to nie czysta metoda JavaScript, tam jest właściwością accessor .sizeof Set obiektu, który jest trochę wygląda jak .size(), ale nie jest to metoda funkcji, tak jak powiedziałem, jest to własność akcesor zestawu obiektu, aby pokazać unikalny numer (unikalne) elementy w obiekcie Set.

Właściwość akcesorium rozmiaru zwraca liczbę (unikalnych) elementów w obiekcie 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

I lengthjest właściwością iterowalnego obiektu (tablicy), która zwraca liczbę elementów w tej tablicy. Wartość jest 32-bitową liczbą całkowitą bez znaku, która jest zawsze liczbowo większa niż najwyższy indeks w tablicy.

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

console.log(clothing.length);
// expected output: 4
AmerllicA
źródło
0

możemy użyć właściwości .length do ustawienia lub zwrócenia liczby elementów w tablicy. zwracana wartość to liczba

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

możemy .size na wypadek, gdybyśmy potrzebowali odfiltrować zduplikowane wartości i uzyskać liczbę elementów w zestawie.

const set = new set([1,1,2,1]); 
 console.log(set.size) ;`
Sunali Bandara
źródło