簡體   English   中英

獲取 boolean 屬性,如果不存在則默認為 true

[英]Get boolean property, or default true if it doesn't exist

在 javascript 中,是否有更好的方法來獲取 object 上的 boolean 屬性的值,但如果該屬性不存在,則默認為 true ,而不是下面?

 (typeof myObj.myProp !== "undefined" ? myObj.myProp : true);

我覺得必須有更好的方法來做到這一點。

測試用例...

 myObj = {}; // return true
 myObj = { myProp: false; } // return false;
 myObj = { myProp: true; } // return true

ECMAScript 2020 引入了空值合並運算符??

 const test = obj => obj.myProp?? true; console.log( test({}) ); // return true console.log( test({ myProp: false }) ); // return false console.log( test({ myProp: true }) ); // return true

但是,在此之前存在的選擇並不多。 您當前的代碼(typeof myObj.myProp?== "undefined". myObj:myProp : true)可能是舊環境中最好的代碼。

如果您確實必須經常處理它們並且無效性是一個持續存在的問題,那么您可以制作一個簡單的包裝器來安全地獲取可能不存在的值:

 function Safe(val) { return { get: function(prop) { if (val == null) return Safe(null); return Safe(val[prop]); }, orElse: function(fallbackValue) { if (val == null) return fallbackValue; return val } } }; console.log( //true Safe({}).get("myProp").orElse(true) ) console.log( // false Safe({ myProp: false }).get("myProp").orElse(true) ); console.log( // true Safe({ myProp: true }).get("myProp").orElse(true) ); var complexObject = { level1: { level2: { myProp: false } } }; console.log( // { "level2": { "myProp": false } } Safe(complexObject).get("level1").orElse(true) ); console.log( // { "myProp": false } Safe(complexObject).get("level1").get("level2").orElse(true) ); console.log( // false Safe(complexObject).get("level1").get("level2").get("myProp").orElse(true) ); console.log( // true Safe(complexObject).get("level1").get("level2").get("level3").get("myProp").orElse(true) );
 .as-console-wrapper { max-height: 100%;important; }

此處的 API 仿照 Java 的Optional但非常簡化。 關鍵是要表明,如果經常出現這種情況,可以進行更安全的處理。

Java 中的Optional在其他地方也稱為OptionMaybe ,更正式地編碼可能null的處理值。 要了解更多如何做到這一點,請參閱GitBooks上的函數式編程最充分指南的這一章(或使用 ES5 語法的舊版本

除了編寫自己的安全處理之外,另一種替代方法是使用支持它的庫,例如 Lodash 的_.get()

 console.log( //true _.get({}, "myProp", true) ); console.log( // false _.get({ myProp: false }, "myProp", true) ); console.log( // true _.get({ myProp: true }, "myProp", true) ); var complexObject = { level1: { level2: { myProp: false } } }; console.log( // { "level2": { "myProp": false } } _.get(complexObject, "level1", true) ); console.log( // { "myProp": false } _.get(complexObject, [ "level1", "level2"], true) ); console.log( // false _.get(complexObject, [ "level1", "level2", "myProp"], true) ); console.log( // true _.get(complexObject, [ "level1", "level2", "level3", "myProp"], true) );
 .as-console-wrapper { max-height: 100%;important; }
 <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>

暫無
暫無

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

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