[英]Handling when Obj does not have key
当它没有密钥时,我们如何让 obj 处理/执行 function?
例如
const abc = { a: () => console.log('key exist') } console.log(abc.a()) console.log (abc.c())
在这里, console.log(abc.a())
将打印密钥存在,但我希望如果有人试图访问不存在的密钥,那么它应该运行不同的 function。
我希望它在 object 级别处理这件事,即我可以做if (abc[c])
然后做其他事情,但因为我要从许多不同的地方调用这个 obj 而我不想有 if-else健康)状况。
这可能吗?
也许这个?
const abc = { a: () => console.log('key exist'), notfound: () => console.log('key does\'t exit') } console.log(abc.a()) console.log ((abc?.c||abc.notfound)())
您可以先检查 object 上是否存在属性 c。 我还添加了一个检查,看看它是否确实是 function。
const abc = { a: () => console.log('key exist') } console.log(abc.a()); console.log (abc.c && typeof abc.c === 'function'? abc.c(): "not found");
您可以使用 Nullish 合并运算符来解决您的问题:
空值合并运算符 (??)是一个逻辑运算符,当其左侧操作数为 null 或未定义时返回其右侧操作数,否则返回其左侧操作数。
更多信息请参阅MDN Web Docs - Nullish Coalescing Operator 。
Nulish 合并运算符是 ECMAScript 2020 规范的一部分。 我可以使用查找来获取浏览器支持的详细信息。
//With external default (() => { const abc = { a: () => console.log('key exist') } const myFunction = abc.c?? (() => console.log("key doesn't exist")) myFunction(); })(); //With internal default (() => { const abc = { a: () => console.log('key exist'), default: () => console.log("key doesn't exist") } const myFunction = abc.c?? abc.default myFunction(); })();
如果您的项目需要支持旧版浏览器,请改用二元逻辑运算符 OR ( ||
) :
当且仅当其一个或多个操作数为真时,一组操作数的逻辑 OR (||)运算符(逻辑析取)为真。
如果一个值可以转换为真,那么这个值就是所谓的真值。 如果一个值可以被转换为假,那么这个值就是所谓的假。
可以转换为假的表达式
null
NaN
0
- 空字符串(
""
或''
或`` )undefined
更多信息请参阅MDN Web 文档 - 逻辑或。
//With external default (() => { const abc = { a: () => console.log('key exist') } const myFunction = abc.c || (() => console.log("key doesn't exist")) myFunction(); })(); //With internal default (() => { const abc = { a: () => console.log('key exist'), default: () => console.log("key doesn't exist") } const myFunction = abc.c || abc.default myFunction(); })();
我想避免每次需要运行可能存在或不存在的 function 时都使用if/else
,您可以创建一个全局 function:
const run = (cb) => typeof cb === "function"? cb(): () => {} const abc = { a: () => console.log('key exist') } console.log(run(abc.a)) console.log(run(abc.c))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.