Os seguintes dois snippets de código diferentes parecem equivalentes para mim:
var myArray = Array();
myArray['A'] = "Athens";
myArray['B'] = "Berlin";
e
var myObject = {'A': 'Athens', 'B':'Berlin'};
porque ambos se comportam da mesma forma, e também typeof(myArray) == typeof(myObjects)
(ambos produzem 'objeto').
Existe alguma diferença entre essas variantes?
fonte
title
,description
eitems
propriedades. Tudo depende de quão bem você conhece o idioma e de como o usa.Em JS arrays são objetos, apenas ligeiramente modificados (com mais algumas funções).
Funções como:
fonte
Eu penso, sou muito metafórico e enigmático com a resposta anterior. O esclarecimento segue.
Uma instância de Array, Boolean, Date, Function, Number, RegExp, String é um objeto, mas aprimorado com métodos e propriedades específicos para cada tipo. Por exemplo, uma matriz tem uma
length
propriedade predefinida , enquanto objetos genéricos não.monitores
Intrinsecamente, o interpretador FF Gecko também distingue entre Arrays e Objetos genéricos com diferenças distintas avaliando construções de linguagem.
exibindo
e
0 1 2 a
e0 1 2 a
.Em relação à declaração de que todos os objetos são funções:
Não é sintaticamente nem semanticamente correto usar uma instância de objeto arbitrário como uma função como
123()
ou"abc"()
ou[]()
ou{}()
ouobj()
ondeobj
é qualquer tipo diferente deFunction
, então um objeto arbitrário INSTÂNCIA não é aFunction
. No entanto, dado um objetoobj
e seu tipo comoArray, Boolean, Date, ...
, comoobj
veio a ser como umArray, Boolean, Date, ...
? O que é umArray, Boolean, Date, ...
?monitores
Em todos os casos, sem equívocos, o tipo de objeto se manifesta como uma
function
definição, daí a afirmação de que todos os objetos são funções! (A ironia é que eu intencionalmente obscureci e borrou a distinção de uma instância de objeto com a de seu tipo! Ainda assim, isso mostra "você não pode ter um sem o outro", Objeto e Função! A capitalização enfatiza o tipo como oposto a instância.)Tanto um paradigma funcional quanto um de objeto parecem ser fundamentais para a programação e implementação dos primitivos integrados de baixo nível do interpretador JS, como
Math
eJSON
etrue
.monitores
Na época do desenvolvimento do Javascript, um estilo de programação centrado em objetos (OOP's - estilo de programação orientada a objetos - o "s" é meu próprio trocadilho!) Estava em voga e o interpretador foi batizado de forma semelhante com Java para dar-lhe maior credibilidade . Técnicas de programação funcional foram relegadas a exames mais abstratos e esotéricos estudando as teorias de autômatos, funções recursivas, linguagens formais, etc. e, como tal, não são palatáveis. No entanto, os pontos fortes dessas considerações formais são claramente manifestos em Javascript, particularmente conforme implementado no motor Gecko do FF (isto é
.toSource()
).A definição de objeto para Função é particularmente satisfatória porque é definida como uma relação de recorrência! definido usando sua própria definição!
function Function() { [native code] }
e uma vez que uma função é um objeto, o mesmo sentimento vale para
function Object() { [native code] }
.A maioria das outras definições silencia para um valor terminal estático. Contudo,
eval()
é um primitivo particularmente poderoso e, portanto, uma String também pode incorporar uma funcionalidade arbitrária.Observe novamente, o vernáculo usado acima obscurece o tipo de objeto e distinção de instância.
fonte
Tudo em JavaScript é um objeto além dos tipos primitivos.
O código
cria uma instância do objeto Array enquanto
cria uma instância do objeto Object.
Tente o seguinte código
Você verá que a diferença está no tipo de construtor de objeto.
A instância do objeto Array conterá todas as propriedades e métodos do protótipo Array.
fonte
fonte
Você pode adicionar propriedades nomeadas a quase tudo em javascript, mas isso não significa que você deve.
Array
em javascript deve ser usado como uma lista, se você quiser um uso de array associativoObject
.Esteja ciente de que se você realmente quiser usar um
Array
com propriedades nomeadas em vez deObject
essas propriedades não serão acessíveis em umfor...of
loop e você também poderá obter resultados inesperados ao codificá-lo em JSON para passá-lo. Veja o exemplo abaixo onde todos os índices não numéricos são ignorados:fonte
A
{}
-notação é apenas um açúcar sintático para tornar o código mais agradável ;-)JavaScript tem muitas construções semelhantes, como a construção de funções, onde function () é apenas um sinônimo para
fonte
{}
é a notação de objeto literal,[]
é um array literal, não tenho certeza de qual é o ponto de sua resposta.