javascript也支援關聯陣列?與對象相比是不是存取效率更高?

來源:互聯網
上載者:User
如題,原來一直誤以為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 的對象實現。

對象的實現分爲兩層:

  • Named properties: in-object properties and extra properties

  • Numbered properties: fast elements

而模式有 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個是'等價'的:

  1. obj.attr = value
  2. obj['attr']=value

只不過2裡面支援obj['attr'+var]=value,能更加靈活,比如一個迴圈語句裡面。

控制台試試就知道咯

arr=[];arr["color"]="red";arr["name"]="apple";console.log(arr);console.log(arr.length);

你這樣做其實和使用對象是沒有區別的

在javascript中,對象即關聯陣列,關聯陣列也即對象。javascript權威指南對象章節有說。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.