181
4

8 回答 8

110

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

一个未定义的变量:

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

具有值的变量undefined

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

当一个函数接受一个参数时,即使它的值为 ,该参数总是被声明undefined,因此不会有任何错误。不过,你是对!= null的,但毫无用处!== undefined

于 2013-05-21T14:39:36.947 回答
94

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

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

正如@rynah 提到的,“未定义”在 JavaScript 中有点令人困惑。然而,测试是否typeof(x)是字符串“undefined”总是安全的,即使“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)) {
    // ...

该片段相当于说“如果使用已定义且不为空的参数调用函数......”

于 2013-05-21T14:51:17.790 回答
17

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

function test(data) {
    if (data != null) {
        console.log('Data: ', data);
    }
}

test();          // the data=undefined
test(null);      // the data=null
test(undefined); // the data=undefined

test(0); 
test(false); 
test('something');

在这里你有所有(src):

如果

在此处输入图像描述

==(它的否定!=

在此处输入图像描述

===(它的否定!==

在此处输入图像描述

于 2019-04-24T04:42:29.960 回答
8

问:该函数在没有参数的情况下被调用,从而使 data 成为未定义的变量,并在 data != null 上引发错误。

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

问:该函数是专门用 null(或 undefined)作为其参数调用的,在这种情况下 data != null 已经保护了内部代码,呈现 && data !== undefined 无用。

问:该函数是使用非空参数调用的,在这种情况下,它会简单地传递 data != null 和 data !== undefined 。

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

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

请参阅规范的第 11.9.3 节抽象相等比较算法第 11.9.6 节严格相等比较算法

于 2013-05-21T16:20:54.717 回答
3

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");
}
于 2013-05-21T14:43:51.807 回答
3

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

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
  } 
}
于 2017-12-10T11:39:58.090 回答
2

进行测试的简单方法是:

function (data) {
    if (data) { // check if null, undefined, empty ...
        // some code here
    }
}
于 2013-05-21T14:59:20.973 回答
-5
var a;
alert(a); //Value is undefined

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

var c = null;
alert(c); //Value is null
于 2014-08-28T09:48:50.430 回答