簡體   English   中英

JS中驗證對象是否存在的最佳和最快方法是什么?如果它存在,那么它上面也存在某個屬性?

[英]What is the best and fastest way in JS to validate if an object exists and if it does then a certain property exists on it as well?

我必須在使用對象執行任何操作之前進行有效性檢查 -

  1. 如果該對象存在。
  2. 如果它存在,那么它上面也存在某個屬性。

對於前

var obj = {
    key: "value"
}

現在最常規的做法是 -

if(obj) {
    if(obj.hasOwnProperty('key') {
        //Do some action (validity check pass)
        //For Example- console.log(obj.key);
    }
}

但我正在尋找一種更快更有效的方法來解決這個問題。

我會做:

if ( typeof obj != "undefined" && obj.hasOwnProperty('key') ) 
{ 
    console.log('found'); 
} 
else 
{ 
    console.log('not found');
}

像這樣 ?

 var obj = { key: "value" } var objx = null; if(obj && "key" in obj){ document.getElementById("check_one").innerHTML = "is valid"; }else{ document.getElementById("check_one").innerHTML ="is not valid"; } if(obj && "notkey" in obj){ document.getElementById("check_two").innerHTML = "is valid"; }else{ document.getElementById("check_two").innerHTML ="is not valid"; } if(objx && "key" in objx){ document.getElementById("check_three").innerHTML = "is valid"; }else{ document.getElementById("check_three").innerHTML ="is not valid"; } 
 <p> Check One (should be valid): <span id="check_one"></span> </p> <p> Check Two (should be invalid): <span id="check_two"></span> </p> <p> Check Three (should be invalid) <span id="check_three"></span> </p> 

根據您所需的瀏覽器支持,您也可以使用Reflect.has

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/has

喜歡

Reflect.has(obj, 'key');

如果你想支持舊的IE,我猜你將不得不使用HasOwnProperty,那里不會有任何其他可能性 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/ hasOwnProperty

您可以將這兩個語句合並為一個,如@Stuart和@phuzi所述:

if(!!obj && obj.hasOwnProperty('key')

hasOwnProperty也會忽略原型中所有繼承的屬性。 如果您希望包含繼承的屬性,則可以在此處使用in運算符。

if (!!ob && (prop in ob))

如果你關心原型鏈,那么沒有更好的方法; 你必須檢查鏈中的每個鏈接。

如果沒有,並且屬性通常存在,則可能值得訪問該屬性並捕獲任何異常,但使用性能測試來查看。

但是我要說的問題是你對輸入的限制不夠:要求代碼的調用者提供一個對象並讓他們處理它。

對我而言,它“聞起來”就像兩個獨立的問題:“對象是否存在?”,如果是這樣,提供默認值和“對象是否具有此屬性?”,即業務邏輯。

如果是這樣,請使用標准模式設置默認值:“obj = obj || {};” 例如; 然后測試成為一個單獨的調用,很難“更快”。

暫無
暫無

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

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