Javascript As matrizes são realmente implementadas como matrizes?
A diferença entre um javascriptArray
eObject
não é muito grande. Na verdade, pareceArray
adiciona principalmente olength
, para que você possa usar os doisArray
areiaObject
s como matrizes numéricas:
var ar = new Array();
ar[0] = "foo";
ar["bar"] = "foo";
var ob = new Object();
ob[0] = "foo";
ob["bar"] = "foo";
assert(ar[0] == ob[0] == ar["0"] == ob["0"] == ar.bar == ob.bar); // Should be true.
Então minhas perguntas são,em mecanismos javascript populares (V8, JavaScriptCore, SpiderMonkey etc.), como isso é tratado? Obviamente, não queremos que nossas matrizes sejam realmente armazenadas como mapas de hash com valores-chave! Como podemos ter certeza razoável de que nossos dados são armazenados como uma matriz real?
Tanto quanto posso ver, existem algumas abordagens que os mecanismos podem adotar:
Array
é implementado exatamente da mesma maneira queObject
- como uma matriz associativa com chaves de strinArray
é um caso especial, com umstd::vector
atriz semelhante a @ que apóia as teclas numéricas e alguma heurística de densidade para impedir o uso insano de memória se você fizerar[100000000] = 0;
Array
é o mesmo queObject
, e todos os objetos obtêm uma heurística para ver se o uso de uma matriz faria mais sentidAlgo incrivelmente complicado que eu não penseRealmente isso seria mais simples se houvesse um tipo de matriz adequado toss Matrizes digitadas WebGLtoss).