我最近在Swift编程了很多.今天,当我遇到问题时,我在JavaScipt做了一些工作:
是否有类似于JavaScript中的可选链接?一种防止undefined is not an object没有任何变量的方法?
例:
function test(){
if(new Date() % 2){
return {value: function(){/*code*/}};
}
}
test().value();
Run Code Online (Sandbox Code Playgroud)
将失败一半的时间因为有时会test返回undefined.
我能想到的唯一解决方案是功能:
function oc(object, key){
if(object){
return object[key]();
}
}
oc(test(), 'value');
Run Code Online (Sandbox Code Playgroud)
我希望能够做到这样的事情:
test()?.value()
Run Code Online (Sandbox Code Playgroud)
问号后面的部分仅在test返回对象时执行.
但这不是很重要.还有更好的东西吗?运营商的神奇组合?
编辑我知道我可以重写test以返回一些东西.但我想知道是否有类似可选链接的东西.我对上面例子的特定解决方案不感兴趣.如果无法控制返回undefined的函数,我也可以使用的东西.
在纯JavaScript中,您必须进行类型检查或构造代码,以便您知道对象将存在.
?.如果您愿意考虑预处理语言,CoffeeScript是一种可编译为JavaScript的语言,它为安全链接提供了一个存在运算符.
还有另一个讨论在这里你为什么不能在JS重现此问题.
关于在未来版本的JavaScript中添加存在主体运算符的ESDiscuss论坛也有讨论.虽然它似乎并不遥远,但实际上并没有接近实际用途.此时更多的想法.
这是目前的第1阶段提案,您可以在此查看其进度:
你今天可以使用babel插件:
https://www.npmjs.com/package/babel-plugin-transform-optional-chaining
可选链接运算符拼写?..它可能出现在三个位置:
obj?.prop // optional static property access
obj?.[expr] // optional dynamic property access
func?.(...args) // optional function or method call
Run Code Online (Sandbox Code Playgroud)
笔记:
为了让foo?.3:0被解析为foo?.3:0(对于向后兼容性的要求),在词法语法的层次上添加一个简单的先行,以便字符序列?在这种情况下,不会将其解释为单个标记(?.标记不能紧跟一个十进制数字).
https://github.com/tc39/proposal-optional-chaining
还值得一试:
https://github.com/tc39/proposal-nullish-coalescing
可选链已经登陆 JS。我们可以通过?.对象属性访问中的运算符使用可选链。它允许我们尝试访问可能不存在(即存在undefined)的对象的属性,而不会引发错误。
这是一个代码示例:
const obj = {
foo: {
bar: 1
}
};
// If we try to access property which doesn't exists
// it just returns undefined
console.log(obj.baz);
try {
// Now we try to access a property of undefined which throws an error
obj.baz.foz;
} catch (e) {
console.dir(e.message);
}
// Now we use the optional chaining operator ?.
// We get undefined instead of an error
console.log(obj.baz?.foz);
console.log(obj.foo?.bar);Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2591 次 |
| 最近记录: |