我们经常在JavaScript代码中使用以下代码模式

if (typeof(some_variable) != 'undefined' && some_variable != null)
{
    // Do something with some_variable
}

是否有一种不那么冗长的检查方法具有相同的效果?

根据一些论坛和文献,简单地说下面应该有同样的效果。

if (some_variable)
{
    // Do something with some_variable
}

不幸的是,当some_variable未定义时,Firebug在运行时将这样的语句计算为错误,而第一个语句对它来说很好。这仅仅是Firebug的一种(不必要的)行为,还是这两种方式之间真的有一些区别?


当前回答

类似于你所做的,你可以这样做

If (some_variable === undefined || some_variable === null) { 做的东西 }

其他回答

在浏览器中打开开发人员工具,并尝试如下图所示的代码。

我认为最有效的测试“值为空或未定义”的方法是

if ( some_variable == null ){
  // some_variable is either null or undefined
}

所以这两条线是等价的

if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}

注1

正如问题中提到的,短变体要求some_variable已声明,否则将抛出ReferenceError。然而,在许多用例中,你可以假设这是安全的:

检查可选参数:

function(foo){
    if( foo == null ) {...}

检查现有对象上的属性

if(my_obj.foo == null) {...}

另一方面,typeof可以处理未声明的全局变量(只是返回未定义)。然而,正如Alsciende解释的那样,出于充分的理由,这些病例应该减少到最低限度。

注2

这个更短的变体是不等价的:

if ( !some_variable ) {
  // some_variable is either null, undefined, 0, NaN, false, or an empty string
}

so

if ( some_variable ) {
  // we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}

注3

一般情况下,建议使用===代替==。 建议的解决方案是这条规则的一个例外。为此,JSHint语法检查器甚至提供了eqnull选项。

jQuery风格指南:

严格的相等性检查(===)应该用于==。唯一的 异常是在检查undefined和null时通过null的方式。

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;

2021 - 03年编辑:

现在大多数浏览器 支持null合并运算符(??) 和逻辑空赋值(??=),这允许更简洁的方式 如果变量为空或未定义,则指定一个默认值,例如:

if (a.speed == null) {
  // Set default if null or undefined
  a.speed = 42;
}

可以写成这些形式中的任何一种

a.speed ??= 42;
a.speed ?? a.speed = 42;
a.speed = a.speed ?? 42;

我用过这个方法

将id保存在某个变量中

var someVariable = document.getElementById("someId");

然后使用if条件

if(someVariable === ""){
 //logic
} else if(someVariable !== ""){
 //logic
}

你必须区分不同的情况:

变量可以是未定义的或未声明的。如果在typeof以外的任何上下文中访问未声明的变量,将会得到一个错误。

if(typeof someUndeclaredVar == whatever) // works
if(someUndeclaredVar) // throws error

已声明但未初始化的变量是未定义的。

let foo;
if (foo) //evaluates to false because foo === undefined

Undefined properties , like someExistingObj.someUndefProperty. An undefined property doesn't yield an error and simply returns undefined, which, when converted to a boolean, evaluates to false. So, if you don't care about 0 and false, using if(obj.undefProp) is ok. There's a common idiom based on this fact: value = obj.prop || defaultValue which means "if obj has the property prop, assign it to value, otherwise assign the default value defautValue". Some people consider this behavior confusing, arguing that it leads to hard-to-find errors and recommend using the in operator instead value = ('prop' in obj) ? obj.prop : defaultValue

let varToCheck = "";//你必须先定义变量,否则会抛出错误 Const excluded = [null, undefined, ""]; if (!excluded.includes(varToCheck)) { //它将不是null,不是undefined,不是void字符串 console.log(“通过”); }其他{ console.log(“失败”); }

例如,我复制vladernn的答案来测试,你也可以点击按钮“复制片段来回答”来测试。