Pergunta

Ou seja, como é que o código a seguir:

var sup = new Array(5);
sup[0] = 'z3ero';
sup[1] = 'o3ne';
sup[4] = 'f3our';
document.write(sup.length + "<br />");

saída de '5' para o comprimento, quando tudo que você fez é definido vários elementos?

O meu 'problema' com este código é que eu não entendo como length muda sem chamar um getLength() ou um método setLength(). Quando eu faço qualquer um dos seguintes:

a.length
a['length']
a.length = 4
a['length'] = 5

de um objecto não-matriz, que se comporta como uma matriz Dict / associativa. Quando eu fizer isso no objeto matriz, ela tem um significado especial. O mecanismo de JavaScript permite que isso aconteça? Does JavaScript têm algum tipo de sistema de propriedade que se traduz

a.length
a['length']

em "get" métodos e

a.length = 4
a['length'] = 5

em "set" métodos?

Foi útil?

Solução

Tudo em JavaScript é um objeto. No caso de um Array, a propriedade length retorna o tamanho da área de armazenamento interno para artigos indexados da matriz. Parte da confusão pode entrar em jogo em que o operador [] funciona para ambos os argumentos numéricos e cordas. Para uma matriz, se você usá-lo com um índice numérico, ele retorna / define o item indexado esperado. Se você usá-lo com uma corda, ele retorna / define a propriedade chamado no objeto array - a menos que os corresponde string para um valor numérico, em seguida, ele retorna o item indexado. Isto é porque no JavaScript índices de matriz são forçados para cordas por uma chamada toString() implícito. Francamente, este é apenas mais dessas coisas que faz você coçar a cabeça e dizer um "JavaScript, este, é por isso que eles riem de você."

A representação subjacente real pode ser diferente entre os navegadores (ou talvez não). Eu não confiar em qualquer coisa que não seja a interface que é fornecido quando se trabalha com ele.

Você pode descobrir mais sobre matrizes de JavaScript em MDN .

Outras dicas

Para adicionar a resposta de tvanfosson: Em ECMA-262 (a especificação 3.0, creio eu), as matrizes são simplesmente definida como tendo esse comportamento para definir as propriedades (ver 15.4.5.1). Não há nenhum mecanismo geral que lhe está subjacente (pelo menos a partir de agora.) - este é apenas como é definido, e como intérpretes Javascript deve comportar

Isso realmente depende do que você pretende fazer com ele.

[].length é "mágico".
Na verdade, não devolver o número de itens na matriz. Ele retorna o maior índice instalada na matriz.

var testArr = [];  testArr[5000] = "something";  testArr.length; // 5000

Mas o método atrás do setter está escondido no próprio motor.
Alguns motores em alguns navegadores lhe dará acesso a suas implementações dessas mágicas-métodos. Outros vão manter tudo completamente bloqueado.

Portanto, não dependem de métodos defineGetter e defineSetter, ou mesmo, de verdade, métodos __proto__, se você não sabe quais navegadores você sabe que você está alvejando e que você não é.

Isto irá mudar no futuro, onde opt-in aplicações escritas em ECMAScript Next / 6 terá acesso a mais.

ECMAScript navegadores 5 conformes já estão começando a métodos get mágicas oferta set e em objetos e não há mais para vir ... ... mas é provavelmente um tempo afastado antes que você pode despejar suporte para oldIE e uma tonelada de smartphones, et cetera ...

É importante saber que quando você faz sup['look'] = 4; você não estiver usando uma matriz associativa, mas sim modificar propriedades no objeto sup. É equivalente a sup.look = 4; desde que você pode adicionar dinamicamente propriedades em objetos javascript a qualquer momento. sup['length'] faria para uma saída exemplo 5 em seu primeiro exemplo.

Se você está pretendendo implementar objetos com matriz como o acesso, a matriz Mozilla artigo do centro de dev é um grande recurso. Infelizmente eu não sei o em profundidade detalhes de implementação de array mas há um monte de detalhes nesse artigo.

Array objeto herda caller, constructor, length e propriedades name de Function.prototype .

array A JavaScript é um objeto como qualquer outro objeto, mas JavaScript lhe dá sintaxe especial.

arr[5] = "yo"

A descrição acima é açúcar sintático

arr.insert(5,"yo")

que é como você gostaria de acrescentar coisas a um objeto regular. É o que está dentro do Inserir método que altera o valor da arr.Length

Veja minha implementação de um tipo CustomArray aqui: http://jsfiddle.net/vfm3vkxy/4/

Como outras pessoas mencionados, uma propriedade em JavaScript basicamente pode atuar tanto como como getter e um setter de sua matriz (ou corda ou outros insumos).

Por uma questão de fato, você pode experimentar por si mesmo:

const test=[1,2,3,4,5]
test.length = 3
console.log(test) // [1,2,3]
test.length = 5
console.log(test) // guess what happens here!

Tanto quanto eu sei, matrizes em JS não funcionam exatamente como arrays associativos e você tem elementos que são colocados na memória como contiguously possível (dado que você pode ter arrays de objetos mistos), dependendo do motor JS você está considerando.

Como uma nota lateral, eu sou um pouco perplexo que o mais votado resposta mantém espalhar o mito mais simplificada (ou meia-verdade) de "tudo sendo um objeto em JavaScript"; isso não é exatamente verdade , caso contrário você nunca vai estudar primitivas, por exemplo.

Tente fazer isso:

const pippi = "pippi"
pippi.cat = "cat"
console.log(pippi.cat) // will it work? Throw an error? Guess why again

Spoiler: a string é envolto em um objeto descartável para essa operação específica na segunda linha, em seguida, no seguinte você está indo só para aceder a uma propriedade do primitivo que não está lá (desde que você não jogar com String.prototype ou semelhantes), de modo a obter undefined.

Características de uma matriz JavaScript

  1. Dinâmica - Arrays em JavaScript podem crescer dinamicamente .push
  2. Pode ser escassa - Por exemplo, matriz [50000] = 2;
  3. Pode ser denso - Por exemplo, matriz = [1, 2, 3, 4, 5]

Em Javascript, é difícil para o tempo de execução para saber se a matriz vai ser densa ou esparsa. Então, tudo o que podemos fazer é dar um palpite. Todas as implementações usar uma heurística para determinar se a matriz é densa ou esparsa. Por exemplo, o código do ponto 2 acima, pode indicar a execução JavaScript que este é provavelmente uma implementação matriz escasso. Se a matriz é inicializado com uma contagem inicial, isso pode indicar que esta é provavelmente uma matriz densa.

Quando o tempo de execução detecta que a matriz é esparsa, ele é implementado de forma semelhante a um objeto. Então, ao invés de manter uma matriz contígua, um mapa de chave / valor é construído.

Para mais de Referência - https://www.quora.com/How-are-javascript- matrizes implementada-internamente

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top