[英]fastest way to get a property by name if it exists anywhere in the object graph
[英]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?
我必須在使用對象執行任何操作之前進行有效性檢查 -
對於前
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.