Array.size () vs Array.length

385

Qual é a diferença entre os dois?

Então eu sei que array.size()é uma função enquanto array.lengthé uma propriedade. Existe uma maneira de usar um sobre o outro? Mais um é eficiente? (Eu imaginaria .lengthser significativamente mais rápido, pois é uma propriedade e não uma chamada de método?) Por que alguém usaria a opção mais lenta? Existem alguns navegadores incompatíveis com um ou outro?

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

Irá imprimir:

  0, 0, true
  3, 3, true
Abraham P
fonte
63
Onde você encontrou o Array.size()método no JavaScript nativo?
VisioN
2
O Chrome não possui .size...
0x499602D2
11
@AbrahamP idk o console do Chrome que você está usando ...
Naftali aka Neal
3
.size()É provável da estrutura Prototype: prototypejs.org/doc/latest/language/Array/prototype/size
MikeM

Respostas:

535

Array.size () não é um método válido

Sempre use a propriedade length

Há uma biblioteca ou script adicionando o método size ao protótipo de matriz, pois esse não é um método de matriz nativo. Isso geralmente é feito para adicionar suporte a um getter personalizado. Um exemplo disso é quando você deseja obter o tamanho na memória de uma matriz (que é a única coisa em que posso pensar que seria útil para esse nome).

Infelizmente, o Underscore.js define um sizemétodo que realmente retorna o comprimento de um objeto ou matriz. Como, infelizmente, a propriedade length de uma função é definida como o número de argumentos nomeados, a função declara que eles devem usar uma alternativa e o tamanho foi escolhido (a contagem seria uma escolha melhor).

Gabriel
fonte
154

.size()não é uma função JS nativa do Array(pelo menos não em qualquer navegador que eu conheça).

.length deve ser usado.


E se

.size() faz o trabalho na sua página, certifique-se que você não tem quaisquer bibliotecas extras incluídos como protótipo que é mucking com oArrayprotótipo.

ou

Pode haver algum plug-in no seu navegador que esteja mexendo com o Arrayprotótipo.

Naftali tcp Neal
fonte
@BartFriederichs bem, eu estou no Chrome, mas é bom saber :-D
Naftali aka Neal
Funciona no Chrome, não funciona no Firefox, eu costumo usar o Chrome para necessidades de depuração, por isso parecia funcionar. Obrigado por apontar sua inexistência.
Abraham P
9
Se funcionar no Chrome para você, provavelmente há uma biblioteca extra que você está chamando na sua página que a adiciona ao protótipo Array.
Spike Williams
11
Versão 23.0.1271.97 [] .size function size () {return this.length;} Então, na verdade, é apenas um invólucro em torno de .length ... Eu meio que me sinto estúpido agora ...
Abraham P
2
@AbrahamP, pressione F12 nesta página e digite [].sizeo console. Se funcionar, você tem algum tipo de plug-in do Chrome que está mexendo com o protótipo Array, e eu ficaria preocupado. :)
aquinas
30

A .size()função está disponível no Jquery e em muitas outras bibliotecas.

A .lengthpropriedade funciona apenas quando o índice é um número inteiro.

A lengthpropriedade vai trabalhar com este tipo de matriz:

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

A lengthpropriedade não funcionará com este tipo de matriz:

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

Portanto, no seu caso, você deve usar a .lengthpropriedade

Saurabh Chandra Patel
fonte
Existe algo que funcione com Strings se o tamanho não funcionar?
Chris
2
@ Chris para arrays com chaves string, como pbookacima, você pode usar $(pbook).size();[exige jQuery]
pastosa desagradável
3
Por que você colocaria dois espaços em todos os lugares?
Publicar Auto
19

.size() é do jQuery, muito provavelmente você está confundindo ou retirando de alguém que importou a biblioteca do jQuery para o projeto dele.

Se você tivesse o jQuery importado e escreveria assim $(array).size(), retornaria o comprimento da matriz.

Julio Flores
fonte
11
Muitas bibliotecas usar .size()não só é jquery
Naftali aka Neal
15

array.length não é necessariamente o número de itens na matriz:

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

O comprimento da matriz é um a mais que o índice mais alto.

Como afirmado anteriormente, Array.size()não é um método válido.

Mais Informações

user2811108
fonte
Na prática, é o número de itens. A maioria dos interpretadores JS preencherá as linhas da matriz com indefinido. No seu exemplo, você terá 101 elementos em sua matriz com 97 elementos sem valor (indefinido), mas os elementos estão lá. Ele terá a seguinte aparência: ['car1', 'car2', 'car3', indefinido * 97, 'car100'] Se você fizer um loop nessa matriz, sua variável de incremento valorizará 101 após o loop.
31718 ElJackiste
Por outro lado, array.length não é necessariamente o número de valores definidos (não atribuídos) na matriz.
ElJackiste
4

A propriedade 'length' retorna a (last_key + 1) para matrizes com chaves numéricas:

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

imprimirá 12!

Isso funcionará:

var  nums  =  new  Array ();
nums [ 10 ]  =  10 ; 
nums [ 11 ]  =  11 ;
nums [ 12 ]  =  12 ;
log.info( nums.length + '  /  '+ Object.keys(nums).length );
cskwg
fonte
Ainda que esta seja uma resposta interessante, eu não estou completamente certo que é uma resposta a esta pergunta
OliverRadini
O OP estava perguntando 'Array.size () vs Array.length'. Das discussões anteriores, ficou claro que a função 'size' não faz parte do JavaScript padrão, mas é implementada pelas bibliotecas. Portanto, estou assumindo que o OP está interessado em recuperar o tamanho real das matrizes JavaScript. Estou descobrindo um 'recurso' pouco conhecido do JavaScript que pode levar a um comportamento inesperado, especialmente porque o comportamento é diferente quando a matriz contém outros tipos de objetos, como seqüências de caracteres, por exemplo.
Cskwg
2

O tamanho detecta duplicatas, retornará o número de valores exclusivos

const set1 = new Set([1, 2, 3, 4, 5, 5, 5, 6]);
console.log(set1.size);
// expected output: 6
rev
fonte
1

Na verdade, .size()não é um método JavaScript puro, há uma propriedade acessadora .sizedo objeto Set que parece um pouco, .size()mas não é um método funcional, assim como eu disse, é uma propriedade acessadora de um objeto Set para mostrar o número único de elementos (exclusivos) em um objeto Set.

A propriedade size accessor retorna o número de elementos (exclusivos) em um objeto 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

E lengthé uma propriedade de um objeto iterável (matriz) que retorna o número de elementos nessa matriz. O valor é um número inteiro de 32 bits não assinado que é sempre numericamente maior que o índice mais alto da matriz.

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

console.log(clothing.length);
// expected output: 4
AmerllicA
fonte
0

podemos usar a propriedade .length para definir ou retornar o número de elementos em uma matriz. valor de retorno é um número

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

podemos usar .size, caso seja necessário filtrar valores duplicados e obter a contagem de elementos em um conjunto.

const set = new set([1,1,2,1]); 
 console.log(set.size) ;`
Sunali Bandara
fonte