在JavaScript中处理可选返回值的最佳方法是什么?

在JavaScript中处理可选返回值的最佳方法是什么?,javascript,functional-programming,optional,Javascript,Functional Programming,Optional,我试图用JavaScript编写一个返回值或false的函数。是否存在类似Scala中的某种“选项”返回类型?例如,在Scala中: def foo(): Option[T]() 在JavaScript中,我能找到的唯一方法是通过不同的返回值,例如: function foo() { if (x) { return "value"; } else { return false; } } 这是习惯用语还是有更好的方法?不,没有。认为JS是“弱类型”。 通常在这种情况

我试图用JavaScript编写一个返回值或false的函数。是否存在类似Scala中的某种“选项”返回类型?例如,在Scala中:

def foo(): Option[T]()
在JavaScript中,我能找到的唯一方法是通过不同的返回值,例如:

function foo() {
  if (x) {
    return "value";
  } else {
    return false;
  }
}

这是习惯用语还是有更好的方法?

不,没有。认为JS是“弱类型”。

通常在这种情况下,您要么返回
null
要么返回
undefined
。 对于返回对象类型的函数,通常是第一个,例如在DOM API中:

let node = document.getElementById("foo");

if (node) {
  // do something
}
如果id为
foo
的节点不存在,
node
将为
null
。该检查之所以有效,是因为
null
falsy

在您的示例中,如果返回一个字符串,最好的方法可能是要么返回一个空字符串,也就是“falsy”,要么
未定义


但是没有什么能比得上
选项
是Scala或Rust。

不,没有。认为JS是“弱类型”。

通常在这种情况下,您要么返回
null
要么返回
undefined
。 对于返回对象类型的函数,通常是第一个,例如在DOM API中:

let node = document.getElementById("foo");

if (node) {
  // do something
}
如果id为
foo
的节点不存在,
node
将为
null
。该检查之所以有效,是因为
null
falsy

在您的示例中,如果返回一个字符串,最好的方法可能是要么返回一个空字符串,也就是“falsy”,要么
未定义


但是没有什么比
选项更像是Scala或Rust。

Javascript不附带带标签的联合。但是,您可以自己轻松地实现它们:

const union=type=>(标记,o)=>
(o[type]=type,o.tag=tag.name | | tag,o);
常数匹配=(tx,o)=>
o[tx.tag](tx);
常量选项=联合(“选项”);
const None=选项(“None”,{});
constsome=Some=>选项(Some,{Some});
常数头=xs=>
xs.length==0
? 没有一个
:一些(xs[0]);
常数xs=[11,22,33],
ys=[];
const foo=匹配(头部(xs){
无:()=>0,
Some:({Some})=>Some
});
常数条=匹配(头部(ys){
无:()=>0,
Some:({Some})=>Some
});
console.log(foo,bar);

Javascript不附带带标记的联合。但是,您可以自己轻松地实现它们:

const union=type=>(标记,o)=>
(o[type]=type,o.tag=tag.name | | tag,o);
常数匹配=(tx,o)=>
o[tx.tag](tx);
常量选项=联合(“选项”);
const None=选项(“None”,{});
constsome=Some=>选项(Some,{Some});
常数头=xs=>
xs.length==0
? 没有一个
:一些(xs[0]);
常数xs=[11,22,33],
ys=[];
const foo=匹配(头部(xs){
无:()=>0,
Some:({Some})=>Some
});
常数条=匹配(头部(ys){
无:()=>0,
Some:({Some})=>Some
});
console.log(foo,bar);

JavaScript中的函数返回一个值,基本上就是这样。null是您需要的。其他语言中的null类似于JS中的undefined,JS中的null更像optional(尽管不能将其视为monad),也没有内置的选项类型包装器,但如果您喜欢Scala之类的类型检查语言,您可能需要查看TypeScript而不是Javascript。Javascript中的函数返回一个值,基本上就是这样。null就是你需要的。其他语言中的null类似于JS中的undefined,JS中的null更像是可选的(尽管您不能将其视为monad)也没有内置的选项类型包装器,但是如果您喜欢Scala之类的类型检查语言,您可能需要查看TypeScript而不是Javascript。