Javascript 是否可以使用较短的辅助函数来代替typeof某物!==“未定义”?

Javascript 是否可以使用较短的辅助函数来代替typeof某物!==“未定义”?,javascript,undefined,Javascript,Undefined,这个很好用 var isRenderer = typeof process !== "undefined" && process.type === "renderer"; 我不喜欢在我的代码中到处都有这种类型的检查,所以我试着编写一个助手函数。但是使用它会导致抛出引用错误 var isRenderer = !isUndefined(process) && process.type === "renderer"; function isUndefined(val

这个很好用

var isRenderer = typeof process !== "undefined" && process.type === "renderer";
我不喜欢在我的代码中到处都有这种类型的检查,所以我试着编写一个助手函数。但是使用它会导致抛出引用错误

var isRenderer = !isUndefined(process) && process.type === "renderer";

function isUndefined(val) {
  return typeof val === "undefined";
}
我有两个问题:

为什么我编写的helper函数不起作用? 是否可以编写一个helper函数来替换检查的类型? 我不喜欢在我的代码中到处都有这种类型的检查,所以我试着编写一个助手函数。但是使用它会导致抛出引用错误

var isRenderer = !isUndefined(process) && process.type === "renderer";

function isUndefined(val) {
  return typeof val === "undefined";
}
如果您的函数出现错误,这会告诉我们进程是一个未声明的标识符,而不仅仅是一个值未定义的变量/参数。您可以对未声明的标识符使用typeof,但无法读取其值

不幸的是,您不能编写一个函数来完成您概述的任务。您能到达的最近距离是:

var isRenderer = !isUndefined(typeof process) && process.type === "renderer";

function isUndefined(type) {
  return type === "undefined";
}
请注意,在调用它的地方仍然需要typeof。但至少它避免了一个无声的逻辑错误的机会,如果你有一个未定义的打字错误,就像我经常做的那样

最好的方法是查看您试图使用未声明标识符的原因,并解决这些问题。但除非这样做,否则你需要支票的类型

如果进程是一个声明的标识符,但它的值未定义,那么您的函数就可以工作了。但在这种情况下,你很快就不需要它了,因为。这是ES2020规范中的一项新功能,它存在于现代JavaScript环境Chrome v80+、Firefox v74+、Safari 13.1+中,如果您使用Transbile(例如Babel)进行传输,则可用于较旧的JavaScript环境。那么你的陈述应该是这样的:

// ONLY WORKS IF `process` IS DECLARED
var isRenderer = process?.type === "renderer";
如果进程被声明但其值为undefined或null,isRenderer将为false,因为process?.type的计算结果将为undefined,undefined==renderer为false

但同样,这在您所处的情况下是行不通的,因为流程是一个未声明的标识符

我不喜欢在我的代码中到处都有这种类型的检查,所以我试着编写一个助手函数。但是使用它会导致抛出引用错误

var isRenderer = !isUndefined(process) && process.type === "renderer";

function isUndefined(val) {
  return typeof val === "undefined";
}
如果您的函数出现错误,这会告诉我们进程是一个未声明的标识符,而不仅仅是一个值未定义的变量/参数。您可以对未声明的标识符使用typeof,但无法读取其值

不幸的是,您不能编写一个函数来完成您概述的任务。您能到达的最近距离是:

var isRenderer = !isUndefined(typeof process) && process.type === "renderer";

function isUndefined(type) {
  return type === "undefined";
}
请注意,在调用它的地方仍然需要typeof。但至少它避免了一个无声的逻辑错误的机会,如果你有一个未定义的打字错误,就像我经常做的那样

最好的方法是查看您试图使用未声明标识符的原因,并解决这些问题。但除非这样做,否则你需要支票的类型

如果进程是一个声明的标识符,但它的值未定义,那么您的函数就可以工作了。但在这种情况下,你很快就不需要它了,因为。这是ES2020规范中的一项新功能,它存在于现代JavaScript环境Chrome v80+、Firefox v74+、Safari 13.1+中,如果您使用Transbile(例如Babel)进行传输,则可用于较旧的JavaScript环境。那么你的陈述应该是这样的:

// ONLY WORKS IF `process` IS DECLARED
var isRenderer = process?.type === "renderer";
如果进程被声明但其值为undefined或null,isRenderer将为false,因为process?.type的计算结果将为undefined,undefined==renderer为false


但同样,在您的情况下,这将不起作用,因为进程是一个未声明的标识符。

正如已经回答和注释的那样,在尝试读取变量以将其作为参数传递时,如果不生成错误,则无法将未声明的变量传递给函数

然而,若进程为null,则在检查其属性之前简单地检查该进程是否已定义失败。我通常使用并建议的解决方案是检查对象值,然后检查它是否为null:


通常更安全。

正如已经回答和注释的那样,在尝试读取变量以将其作为参数传递时,如果不生成错误,则无法将未声明的变量传递给函数

然而,若进程为null,则在检查其属性之前简单地检查该进程是否已定义失败。我通常使用并建议的解决方案是检查对象值,然后检查它是否为null:


通常更安全。

您应该问问自己,为什么首先需要定期检查未定义的变量。这本身并不是一个真正的解决方案,但只要在isRenderer或更高级别的范围内添加var流程就足以解决问题,因为它无论如何都会被提升。然后你们可以检查过程的真实性。仍然会掩盖过度滥用全局变量可能存在的潜在问题。你应该问问自己,为什么需要定期检查第一个变量中未定义的变量
t place.本身并不是一个真正的解决方案,但只要在isRenderer或更高级别的范围内添加一个var进程就足以解决问题,因为它无论如何都会被提升。然后你们可以检查过程的真实性。仍然会掩盖过度滥用globals可能存在的潜在问题。您可能还想研究ES2020中提供的可选链接的新功能。@ssc-hrep3-这对上述功能没有帮助,原因与OP的功能不起作用相同。process?.type如果process是未声明的标识符,则会引发ReferenceError。我本想在答案中加一条关于这一点的注释,但后来觉得可能会让人困惑。也许我应该这样做。您可能还想研究ES2020中提供的可选链接的新功能。@ssc-hrep3-这对上述功能没有帮助,原因与OP的功能不起作用相同。process?.type如果process是未声明的标识符,则会引发ReferenceError。我本想在答案中加一条关于这一点的注释,但后来觉得可能会让人困惑。也许我应该。