如題,原來一直誤以為js裡面不能像php那樣定義關聯陣列,如a["color"]=red;
但是前幾天偶然發現可以。
想請教一下這樣的定義方式與操作對象相比是不是更高效?兩者的後台實現方式是不是不一致呢?
//定義對象
obj={color:"red",name:"apple"};
//關聯陣列
arr=[];
arr["color"]="red";arr["name"]="apple";
obj=[];obj.push(arr);
回複內容:
如題,原來一直誤以為js裡面不能像php那樣定義關聯陣列,如a["color"]=red;
但是前幾天偶然發現可以。
想請教一下這樣的定義方式與操作對象相比是不是更高效?兩者的後台實現方式是不是不一致呢?
//定義對象
obj={color:"red",name:"apple"};
//關聯陣列
arr=[];
arr["color"]="red";arr["name"]="apple";
obj=[];obj.push(arr);
Javascript 的數組也是對象,同時任何對象也可以像數組一樣使用,細節如下。
參閱:http://jayconrod.com/posts/52/a-tour-of-v8-object-representation
詳細講解了 V8 的對象實現。
對象的實現分爲兩層:
而模式有 array mode 和 dictionary mode。一般情況會用 array mode,有時也會降級。
Named properties
in-object properties 使用公用 map 來描述其結構,某些情況(難以共用 map)會降級爲 Dictionary mode。
V8 can handle minor divergences like this just fine, but if your code assigns all sorts of random properties to objects from the same constructor in no particular order, or if you delete properties, V8 will drop the object into dictionary mode, where properties are stored in a hash table. This prevents an absurd number of maps from being allocated.
一個叫做 In-object slack tracking 的過程用來決定對象的大小,其後的屬性作爲 extra properties 使用單獨的數組儲存。
Now I'm sure your next question is, "what happens when a new property is added after in-object slack tracking is complete?" This is handled by allocating an overflow array to store the extra properties. The overflow array can always be reallocated with a larger size as new properties are added.
Numbered properties
其中,fast elements 包括
fast small integers
fast doubles
fast values
然而 fast elements 有時也會降級爲 dictionary mode
If you assign to an index that's way past the end of your the elements array, V8 may downgrade the elements to dictionary mode.
當然由於分開儲存,降級並不會影響到其它類型的屬性。
Because named properties and elements are stored separately, even if an object drops into dictionary mode for elements, named properties may still be accessed quickly (and vice versa).
綜上,把 Array 當作 Associative Array 來用,並不會增加效能。
額。。。淺層次點說,下面2個是'等價'的:
- obj.attr = value
- obj['attr']=value
只不過2裡面支援obj['attr'+var]=value,能更加靈活,比如一個迴圈語句裡面。
控制台試試就知道咯
arr=[];arr["color"]="red";arr["name"]="apple";console.log(arr);console.log(arr.length);
你這樣做其實和使用對象是沒有區別的
在javascript中,對象即關聯陣列,關聯陣列也即對象。javascript權威指南對象章節有說。