簡體   English   中英

javascript對象屬性查找

[英]javascript object property lookup

由於javascript中的對象是關聯映射(其他編程語言中的HashMap)執行下一個代碼

for (var prop in object) {
    if (prop === someConcreteProperty) {
        // some decision
        break;
    }
}

慢一點,然后虛擬屬性查找像

if (typeof object.someConcreteProperty != 'undefined') {
    // some decision
}

編輯:

我正在考慮類似代碼的性能:

for ( var prop in obj)
    if (obj[prop] === someAnonymousMethod) {
        // I need that property name for my need
        return obj.prop();
    }

它將是屬性查找時間的兩倍嗎

obj.prop()

或者更多?

謝謝。

我猜對於第一個意思是:

if ('prop' in obj) {
  // ...
}

然后,您可以討論速度差異和不同的行為。

家庭作業:

var obj = { prop: undefined }; // a bit philosophical...

可以憑經驗進行測試:

<script language="javascript">

alert("Initialising test object...");
var obj = new Object();
for (var i=0; i<1000000; i++) obj["prop"+i] = i;


alert("Initialised. Doing Test.");

var d1 = (new Date()).getTime();

needle = obj["prop"+(i-1)]; // last object
for (var prop in obj) {
    if (obj === needle) {
        // some decision
        break;
    }
}

var ms1 = ((new Date()).getTime()) - d1;

alert("Method 1 took "+ms1+"ms.")

var d2 = (new Date()).getTime();

if (typeof obj["prop"+(i-1)] != 'undefined') {
    // some decision
}

var ms2 = (new Date()).getTime() - d2;
alert("Method 2 took "+ms2+"ms.")

</script>

方法1比方法2花費的時間更長。這不足為奇,因為執行方法2所需的所有計算都包含在方法1中,而且還要多得多。

當您了解JavaScript中屬性查找的工作原理后,這個問題的答案就變得顯而易見。 在最壞的情況下,JavaScript對象中的屬性被實現為哈希表中的元素。

在這種情況下,屬性查找平均在恆定時間內執行。 值得注意的是,在非常罕見的最壞情況下,哈希表搜索時間可以是線性的。

如果遍歷屬性列表,則會將性能降低為線性時間,大致與對象中的屬性數量成比例。

所以,是的方法1總是更快, 多得更快,如果對象有很多屬性。

附帶說明:許多現代JavaScript引擎(例如Google的V8)可能會為您優化代碼以提供更好的性能。 實際上,我相信V8中的對象是作為真實類實現的。 在這種情況下,與傳統的哈希表查找不同,可以確保內存查找為恆定時間。

暫無
暫無

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

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