//(typeof(myVar) != "undefined")// 在逻辑上等同于真值 //if (myVar) 吗?

Is //(typeof(myVar) != "undefined")// logically equivalent to the truthy //if (myVar)?

在一个大型项目中,我通过显式检查是否已使用 typeof 设置变量来进行大量异常处理。有点冗长,我想改变我的习惯,简单地说:

if (myVar) {//do stuff}

在下面的代码片段和其他一些测试中,它们似乎是等效的。然而,在我进行彻底的代码更改(并替换其中的数百个)之前,我想确认它们在逻辑上是等价的,并了解可能让我失望的任何边缘情况。

//What I have been doing

let myVar;

{
//other code that may or may not be able to give myVar a value 
}

if (typeof(myVar) != "undefined"){
  console.log("the value has been set, do more stuff");
} else {
  console.log("the value was not set, handle the exception path");
}

//What I'd like to do

if (myVar) {
  console.log("the value has been set, do more stuff");
} else {
  console.log("the value was not set, handle the exception path");
}

没有。 因为在这种情况下 if(myVar) if myVar = 0, false, "",undefined 将是 return false。当 myVar = undefined

if (typeof(myVar) != "undefined") 只是 return 假

它们可以看起来像那样,但结果可能不像您期望的那样。

这里有一些进一步的证明:

const tests = [false, undefined, null, '', NaN, 0, -0, 0n, 'anything else'];
tests.map(t=> console.log(t ? t + ' is truthy' : t + ' is falsy'));

这个:

if (myVar) {}

将 return 对 所有虚假值 为假,例如空字符串 ("")、零 (0)、falsenull,当然还有 undefined

如果您不希望上述任何值通过您的 if 语句,那么是的,它们在逻辑上是等价的。

但是,我会说这是一个 大胆的 声明,您的 if 声明中的 none 将包含 0""。这些是共同的价值观。

如果你想清理这段代码并继续只检查 undefined,那么你可以跳过类型检查,只检查:

if (myVar === undefined) {}

使用感叹号可以检查该变量是否为相反的布尔值,例如 undefined、false、空字符串、null 和 0 是假值

let myVar = undefined;
if(!myVar){
    console.log('type of: ' + typeof(myVar))
}   

myVar = '';
if(!myVar){
    console.log('type of: ' + typeof(myVar))
}   

myVar = false;
if(!myVar){
    console.log('type of: ' + typeof(myVar))
}