簡體   English   中英

如果在javascript中以不同方式訪問屬性,性能是否存在差異?

[英]Is there a difference in performance if accessing properties differently in javascript?

想象一下你想要以這種方式訪問​​的樹狀對象obj1

obj1[prop1"]["prop1_1"]["prop1_1_1"] //do something

但是我不想直接訪問它,所以我寫了一個遞歸函數來幫助我訪問這個對象的任何子元素的任何屬性,如下所示:

function getProperty(obj, path) {
  if(path.length == 1)
    return obj[path[0]];
  return getProperty(obj[path[0]], path.slice(1));
}

現在我稱之為: getProperty(obj1, ["prop1", "prop1_1", "prop1_1_1"])

直接訪問它和使用除函數調用(和切片)之外的遞歸函數訪問它之間是否有任何性能差異?

PS:我之所以需要這個,是因為我想訪問嵌套屬性,但我不知道這些屬性是否存在,如果不是,我想返回默認值。 我沒有在上面的函數中實現它,以便於閱讀。

因此,直接訪問它比使用函數和遞歸具有更好的性能。 這是有道理的,因為在調用函數時,操作系統必須為您做一些准備。 如果您知道匯編,它實際上在調用函數之前首先復制必要的內存數據。 以下基准顯示結果。

 'use strict'; var obj = { prop1: { prop1_1: { prop1_1_1: 'hi' } } }; var start = new Date(); for (var i = 0; i < 1000000; i++) { obj["prop1"]["prop1_1"]["prop1_1_1 "]; } var duration1 = new Date() - start; function getProperty(obj, path) { if (path.length == 1) return obj[path[0]]; return getProperty(obj[path[0]], path.slice(1)); } var start = new Date(); for (var i = 0; i < 1000000; i++) { getProperty(obj, ["prop1", "prop1_1", "prop1_1_1"]); } var duration2 = new Date() - start; // duration1 < duration2 console.log(duration1); console.log(duration2); 

使用循環而不是遞歸肯定會改進getProperty函數,但它不會像直接獲取屬性那樣高效:

function getProperty(obj, path) {
    for(var i = 0; i < path.length && obj; i++)
        obj = obj[ path[i] ];
    return obj;
}

JSPerf結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM