JavaScript空检查

2020/10/23 21:21 · javascript ·  · 0评论

我遇到了以下代码:

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

I'm somewhat new to JavaScript, but, from other questions I've been reading here, I'm under the impression that this code does not make much sense.



In particular, this answer states that

You'll get an error if you access an undefined variable in any context other than typeof.

Update: The (quote of the) answer above may be misleading. It should say «an undeclared variable», instead of «an undefined variable».

As I found out, in the answers by Ryan ♦, maerics, and nwellnhof, even when no arguments are provided to a function, its variables for the arguments are always declared. This fact also proves wrong the first item in the list below.


据我了解,可能会遇到以下情况:

  • 调用该函数时不带参数,因此产生data一个未定义的变量,并在上引发错误data != null

  • 该函数专门以null(或undefined)作为其参数来调用,在这种情况下,该函数data != null已经保护了内部代码,因而变得&& data !== undefined无用。

  • 该函数使用非null参数调用,在这种情况下,它将琐碎地传递data != null data !== 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 !== undefined 之后 data != null的用法可能有用。

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

未定义的变量:

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

具有以下值的变量undefined

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

当一个函数接受一个参数时,即使它的值为undefined也总是声明该参数,因此不会有任何错误。您没错,但!= null随后!== undefined没用。

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

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

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

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

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

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

放在一起,您的支票应如下所示:

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

但是,由于总是定义变量“数据”(因为它是形式函数参数),因此不需要使用“ typeof”运算符,并且可以安全地直接与“未定义的值”进行比较。

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

此代码段的意思是说“如果函数是用已定义且不为null的参数调用的……”

在您的情况下使用data==null(仅适用于null和undefined -在第二张图片上,将焦点放在null / undefined的行/列上)

这是全部(src):

如果

在此处输入图片说明

==(其否定!=

在此处输入图片说明

===(其否定!==

在此处输入图片说明

问:调用该函数时不带参数,因此使数据成为未定义的变量,并在数据!= null上引发错误。

答:是的,data将被设置为undefined。请参见规范的10.5节“声明绑定实例化”。但是访问未定义的值不会引发错误。您可能会将其与在严格模式下访问未声明的变量混淆,这确实会引发错误。

问:该函数专门以null(或未定义)作为参数调用,在这种情况下,data!= null已经保护了内部代码,使&& data!== undefined无效。

问:使用非空参数调用该函数,在这种情况下,它将琐碎地传递data!= null和data!== undefined。

答:正确。请注意,以下测试是等效的:

data != null
data != undefined
data !== null && data !== undefined

请参见第11.9.3节“抽象平等比较算法”第11.9.6节“规范的严格平等比较算法”。

我认为,测试变量以获取不期望的值通常不是一个好主意。因为测试如您所愿,您可以考虑将其写入禁止值黑名单。但是,如果您忘记列出所有禁止值怎么办?甚至您也可以通过传递意外值来破解您的代码。因此,更合适的方法是将其列入白名单-仅针对预期值测试变量,而不是意外变量。例如,如果您希望数据值是字符串,而不是:

function (data) {
  if (data != null && data !== undefined) {
    // some code here
    // but what if data === false?
    // or data === '' - empty string?
  }
}

做这样的事情:

function (data) {
  if (typeof data === 'string' && data.length) {
    // consume string here, it is here for sure
    // cleaner, it is obvious what type you expect
    // safer, less error prone due to implicit coercion
  } 
}

typeof foo === "undefined"与有所不同foo === undefined,请不要混淆它们。typeof foo === "undefined"是您真正需要的。另外,!==代替!=

所以该语句可以写成

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

编辑:

您不能使用foo === undefined未声明的变量。

var t1;

if(typeof t1 === "undefined")
{
  alert("cp1");
}

if(t1 === undefined)
{
  alert("cp2");
}

if(typeof t2 === "undefined")
{
  alert("cp3");
}

if(t2 === undefined) // fails as t2 is never declared
{
  alert("cp4");
}

测试的简单方法是:

function (data) {
    if (data) { // check if null, undefined, empty ...
        // some code here
    }
}
var a;
alert(a); //Value is undefined

var b = "Volvo"; 
alert(b); //Value is Volvo

var c = null;
alert(c); //Value is null
本文地址:http://javascript.askforanswer.com/javascriptkongjiancha.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

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

上一篇:
下一篇:

评论已关闭!