如何在JavaScript中检查未定义或null变量?

2020/09/25 07:41 · javascript ·  · 0评论

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

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

有没有更冗长的检查方法具有相同的效果?

根据一些论坛和文献的说法,简单地讲,以下内容应具有相同的效果。

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

不幸的是,未定义Firebug会将这样的语句评估为运行时错误some_variable,而第一个语句就可以了。这仅仅是Firebug的一种(有害的)行为,还是这两种方式之间确实有区别?

您必须区分两种情况:

  1. 变量可以是undefined或未声明的如果您在之外的任何上下文中访问未声明的变量,则会收到错误消息typeof
if(typeof someUndeclaredVar == whatever) // works
if(someUndeclaredVar) // throws error

已声明但尚未初始化的变量是undefined

let foo;
if (foo) //evaluates to false because foo === undefined
  1. 未定义的属性,例如someExistingObj.someUndefProperty未定义的属性不会产生错误,而只会返回undefined,将其转换为布尔值后将得出false因此,如果您不关心
    0and false,则可以使用if(obj.undefProp)基于这个事实,有一个常见的成语:

    value = obj.prop || defaultValue
    

    这表示“如果obj具有属性prop,请将其分配给value,否则分配默认值defautValue”。

    有些人认为此行为令人困惑,认为它会导致难以发现的错误,因此建议改用in运算符

    value = ('prop' in obj) ? obj.prop : defaultValue
    

我认为最有效的方式来测试“值nullundefined”被

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

因此,这两行是等效的:

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

注1

正如问题中提到的,short变体要求some_variable已声明,否则将引发ReferenceError。但是,在许多用例中,您可以假定这是安全的:

检查可选参数:

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

检查现有对象的属性

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

另一方面typeof可以处理未声明的全局变量(简单地返回undefined)。正如Alsciende解释的那样,出于充分的原因,这些案例应该减少到最少。

笔记2

这个-甚至更短-的变体并不等效:

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

所以

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

注3

通常,建议使用===代替==提议的解决方案是该规则的例外。出于这个原因JSHint语法检查器甚至提供了该eqnull选项。

jQuery样式指南

应该使用严格的相等性检查(===)来支持==。唯一的例外是通过null检查undefined和null时。

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

使用正常相等性检查null也会为未定义返回true。

if (window.variable == null) alert('variable is null or undefined');

JS平等

在更新的JavaScript标准(例如ES5和ES6)中,您可以说

> Boolean(0) //false
> Boolean(null)  //false
> Boolean(undefined) //false

全部返回false,这类似于Python对空变量的检查。因此,如果您想围绕变量编写条件逻辑,只需说

if (Boolean(myvar)){
   // Do something
}

在这里,“空”或“空字符串”或“未定义”将得到有效处理。

如果尝试引用未声明的变量,则所有JavaScript实现都将引发错误。

对象的属性不受相同条件的约束。如果未定义对象属性,则尝试访问它不会引发错误。因此,在这种情况下,您可以缩短:

 if (typeof(myObj.some_property) != "undefined" && myObj.some_property != null)

if (myObj.some_property != null)

考虑到这一点,并且可以将全局变量作为全局对象的属性访问(window对于浏览器),您可以对全局变量使用以下内容:

if (window.some_variable != null) {
    // Do something with some_variable
}

在本地范围内,确保在代码块的顶部声明变量总是有用的,这将节省对的重复使用typeof

首先,您必须非常清楚要测试的内容。JavaScript具有各种隐式转换,可带您进入旅途,还有两种不同类型的相等比较器:=====

一个功能,test(val)该测试nullundefined应具有以下特点:

 test(null)         => true
 test(undefined)    => true
 test(0)            => false
 test(1)            => false
 test(true)         => false
 test(false)        => false
 test('s')          => false
 test([])           => false

让我们看看这里的哪些想法实际上通过了我们的测试。

这些工作:

val == null
val === null || val === undefined
typeof(val) == 'undefined' || val == null
typeof(val) === 'undefined' || val === null

这些不起作用:

typeof(val) === 'undefined'
!!val

我创建了一个jsperf条目来比较这些方法的正确性和性能暂时的结果尚无定论,因为在不同的浏览器/平台上运行次数不足。请花一点时间在计算机上运行测试!

目前,简单val == null测试似乎可以提供最佳性能。它也是最短的。val != null如果想要补充,可以否定测试

这是在其中的唯一的情况下,==!=应使用:

if (val == null) console.log('val is null or undefined')
if (val != null) console.log('val is neither null nor undefined')

由于没有一个完整而正确的答案,因此我将尝试总结一下:

通常,表达式为:

if (typeof(variable) != "undefined" && variable != null)

无法简化,因为variable可能未声明,因此省略typeof(variable) != "undefined"将导致ReferenceError。但是,您可以根据上下文简化表达式

如果variable全局,则可以简化为:

if (window.variable != null)

如果它是local,则可以避免未声明此变量的情况,并且还可以简化为:

if (variable != null)

如果它是object property,则不必担心ReferenceError:

if (obj.property != null)

这是使用Array includes()方法的另一种方法:

[undefined, null].includes(value)

您可以仅检查变量是否具有值。含义,

if( myVariable ) {
//mayVariable is not :
//null
//undefined
//NaN
//empty string ("")
//0
//false

}

如果您不知道变量是否存在(也就是说,是否已声明),则应使用typeof运算符进行检查。例如

if( typeof myVariable !== 'undefined' ) {
    // myVariable will get resolved and it is defined
}

这是一个极少数情况下的示例,建议使用==代替===somevar == null对于undefinednull表达式将返回true ,对于其他所有表达式将返回false(如果未声明变量,则返回错误)。

使用!=会按预期翻转结果。

现代编辑人员不会警告使用==!=操作null,因为这几乎总是所需的行为。

最常见的比较:

undeffinedVar == null     // true
obj.undefinedProp == null // true
null == null              // true
0 == null                 // false
'0' == null               // false
'' == null                // false

自己尝试:

let undefinedVar;
console.table([
    { test : undefinedVar,     result: undefinedVar     == null },
    { test : {}.undefinedProp, result: {}.undefinedProp == null },
    { test : null,             result: null             == null },
    { test : false,            result: false            == null },
    { test : 0,                result: 0                == null },
    { test : '',               result: ''               == null },
    { test : '0',              result: '0'              == null },
]);

我已经用这种方法做到了

将ID保存在某个变量中

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

然后使用if条件

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

如答案之一所述,如果您谈论的是具有全局作用域的变量,那么可能会很幸运。如您所知,您全局定义的变量往往会添加到Windows对象中。您可以利用这一事实,所以可以说您正在访问一个名为bleh的变量,只需使用double倒数运算符(!!)

!!window['bleh'];

当尚未声明bleh并没有为其分配值时,这将返回false。

不管yyy是undefined还是null,它将返回true

if (typeof yyy == 'undefined' || !yyy) {
    console.log('yes');
} else {
    console.log('no');
}

if (!(typeof yyy == 'undefined' || !yyy)) {
    console.log('yes');
} else {
    console.log('no');
}

没有

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

图1
图2

为了理解,让我们分析一下Javascript引擎在转换undefined,null和''(也为空字符串)时返回的值。您可以直接在开发人员控制台上进行检查。

在此处输入图片说明

您可以看到所有这些都将转换为false,这意味着所有这三个都被javascript假设为“不存在”。因此,您无需像下面那样显式检查代码中的所有三个。

if (a === undefined || a === null || a==='') {
    console.log("Nothing");
} else {
    console.log("Something");
}

我也想指出一件事。

Boolean(0)的结果是什么?

当然是假的。当0是预期结果的有效值时,这将在您的代码中创建错误。因此,请确保在编写代码时进行检查。

与您拥有的类似,您可以执行类似的操作

if (some_variable === undefined || some_variable === null) {
do stuff
}

测试null(if (value == null))或non-nullity(if (value != null))的详细程度要比测试变量的定义状态少。

此外,如果将变量(或对象属性)定义为布尔,则进行测试if (value)(或 if( obj.property))以确保变量(或对象属性)的存在失败false买者自负 :)

使用严格的比较运算符可以轻松地区分两个值:

工作示例位于:

http://www.thesstech.com/tryme?filename=nulland未定义

样例代码:

function compare(){
    var a = null; //variable assigned null value
    var b;  // undefined
    if (a === b){
        document.write("a and b have same datatype.");
    }
    else{
        document.write("a and b have different datatype.");
    }   
}

如果if语句的目的是在为变量赋值之前检查nullundefined值,则可以使用Nullish Coalescing Operator,该功能最终可以在JavaScript上使用,尽管浏览器支持有限。根据caniuse的数据,截至2020年4月,仅支持48.34%的浏览器。

const a = some_variable ?? '';

如果some_variablenull,这将确保将变量分配给空字符串(或任何其他默认值)undefined

该运算符最适合您的用例,因为它不会返回其他类型的伪造值(例如0和)的默认值''

将未定义,空值或0与ES5和ES6标准进行比较的最佳方法

 if ((Boolean(some_variable_1) && Boolean(some_variable_2)) === false) {
    // do something
    }

您必须定义这种形式的功能:

validate = function(some_variable){
    return(typeof(some_variable) != 'undefined' && some_variable != null)
}

在ES5或ES6中,如果需要多次检查,可以执行以下操作:

const excluded = [null, undefined, ''];

if (!exluded.includes(varToCheck) {
  // it will bee not null, not undefined and not void string
}

使用R.isNil(yourValue)
Ramda
,您可以简单地使Lodash和其他帮助程序库具有相同的功能。

本文地址:http://javascript.askforanswer.com/ruhezaijavascriptzhongjianchaweidingyihuonullbianliang.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!