JavaScript 空值检查

2022-08-30 01:47:24

我遇到了以下代码:

function test(data) {
    if (data != null && data !== undefined) {
        // some code here
    }
}

我对JavaScript有点陌生,但是,从我在这里阅读的其他问题来看,我的印象是这段代码没有多大意义。


特别是,这个答案指出:

如果您在 typeof 以外的任何上下文中访问未定义的变量,则会收到错误。

更新:上面的(引用)答案可能具有误导性。它应该说“一个未声明的变量”,而不是“一个未定义的变量”。

正如我所发现的,在Ryan ♦maericsnwellnhof的答案中,即使没有向函数提供任何参数,其参数的变量也总是被声明的。这一事实也证明了下面列表中的第一项是错误的。


根据我的理解,可能会遇到以下情况:

  • 该函数在没有参数的情况下被调用,因此使数据成为未定义的变量,并在数据上引发错误!= null

  • 该函数是专门使用 (or ) 作为其参数调用的,在这种情况下,它已经保护了内部代码,使代码变得无用。nullundefineddata != null&& data !== undefined

  • 该函数是使用非空参数调用的,在这种情况下,它将平凡地传递 data != nulldata !== undefined

问:我的理解是否正确?


我已经在Firefox的控制台中尝试了以下内容:

--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true

我无法弄清楚之后可能有什么用处。data !== undefineddata != null


答案 1

“未定义的变量”与值 不同。undefined

未定义的变量:

var a;
alert(b); // ReferenceError: b is not defined

值为 :undefined

var a;
alert(a); // Alerts “undefined”

当函数采用参数时,即使其值为 ,也始终声明该参数,因此不会有任何错误。不过,你是对的,其次是无用的。undefined!= null!== undefined


答案 2

在JavaScript中,是一个特殊的单例对象,它有助于发出“无值”的信号。您可以通过比较来测试它,并且像往常一样,在JavaScript中,使用运算符以避免混淆类型强制是一种很好的做法:null===

var a = null;
alert(a === null); // true

正如@rynah提到的,“未定义”在JavaScript中有点令人困惑。但是,测试字符串是否为字符串“undefined”始终是安全的,即使“x”不是声明的变量:typeof(x)

alert(typeof(x) === 'undefined'); // true

此外,如果未初始化变量,则变量可以具有“未定义的值”:

var y;
alert(typeof(y) === 'undefined'); // true

将它们放在一起,您的检查应如下所示:

if ((typeof(data) !== 'undefined') && (data !== null)) {
  // ...

但是,由于变量“data”始终是定义的,因为它是一个正式的函数参数,因此不需要使用“typeof”运算符,您可以安全地直接与“未定义值”进行比较。

function(data) {
  if ((data !== undefined) && (data !== null)) {
    // ...

这个片段相当于说“如果函数是用一个定义的参数调用的,并且不是空的......”