何时检查undefined以及何时检查null

时间:2011-01-20 14:40:43

标签: javascript null undefined

[Bounty Edit]

我正在寻找一个很好的解释,你应该设置/使用nullundefined以及你需要检查它的位置。基本上这两种常见的做法是什么,并且真的可以在通用的可维护代码中单独处理它们?

我何时可以安全地检查=== null,安全检查=== undefined以及何时需要检查== null

什么时候应该使用关键字undefined,何时应该使用关键字null

我有

格式的各种检查

if (someObj == null)if (someObj != null)检查null和undefined。我想将所有这些更改为=== undefined=== null,但我不确定如何保证它只会是两者之一,而不是两者之一。

您应该在哪里使用null的支票,以及在哪里使用undefined的支票

一个具体的例子:

var List = []; // ordered list contains data at odd indexes.

var getObject = function(id) {
    for (var i = 0; i < List.length; i++) {
        if (List[i] == null) continue;
        if (id === List[i].getId()) {
            return List[i];
        }
    }
    return null;
}

var deleteObject = function(id) {
    var index = getIndex(id) // pretty obvouis function
    // List[index] = null; // should I set it to null?
    delete List[index]; // should I set it to undefined?
}

这只是我可以同时使用nullundefined的一个示例,我不知道哪个是正确的。

在任何情况下,您必须检查nullundefined,因为您别无选择吗?

9 个答案:

答案 0 :(得分:11)

函数隐式返回undefined。数组中未定义的键为undefined。对象中未定义的属性为undefined

function foo () {

};

var bar = [];
var baz = {};

//foo() === undefined && bar[100] === undefined && baz.something === undefined
如果没有找到任何元素,

document.getElementById会返回null

var el = document.getElementById("foo");

// el === null || el instanceof HTMLElement

您永远不必检查undefinednull(除非您汇总来自可能返回null的源和可能返回未定义的源的数据)。

我建议你避免null;使用undefined

答案 1 :(得分:5)

某些DOM方法返回null。当您尝试访问它们时,尚未设置的对象的所有属性都返回undefined,包括Array的属性。没有return语句的函数会隐式返回undefined

我建议您确定您确切地知道您正在测试的变量或属性可能的值,并明确且有信心地测试这些值。要测试null,请使用foo === null。对于undefined的测试,我建议在大多数情况下使用typeof foo == "undefined",因为undefined(与null不同)不是保留字,而是全局的简单属性可能被更改的对象,以及我最近在这里写到的其他原因:variable === undefined vs. typeof variable === "undefined"

答案 2 :(得分:3)

nullundefined之间的区别在于null本身就是一个值,必须进行分配。这不是默认值。没有赋值的全新变量是undefined

var x;
// value undefined - NOT null.
x = null;
// value null - NOT undefined.

答案 3 :(得分:2)

我认为有趣的是,当Windows首次编写时,它没有对无效/ NULL指针进行大量检查。毕竟,没有程序员会愚蠢到足以在需要有效字符串的地方传递NULL。测试NULL只会使代码更大更慢。

结果是许多阿联酋人都是由于客户端程序中的错误,但所有的热量都归于微软。从那以后,微软已经将Windows改为几乎检查每个参数为NULL。

我认为经验教训是,除非你确定论证总是有效,否则可能值得证实。当然,许多程序员都使用Windows,而您的功能可能只能由您使用。因此,这肯定会影响无效论证的可能性。

在C和C ++等语言中,您可以使用ASSERT,并且在使用这些语言时我会一直使用它们。这些陈述可以验证您从未期望发生的某些条件。在调试过程中,您可以测试它实际上从未这样做过。然后,当您执行发布版本时,这些语句不包含在已编译的代码中。在某些方面,这对我来说似乎是两全其美的。

答案 4 :(得分:1)

如果您调用没有显式返回的函数,则它会隐式返回 undefined 。因此,如果我有一个功能需要说它完成了它的任务并且没有任何结果,例如当你通常期望会有某些东西(比如数据库调用)时,XMLHTTPRequest什么也没有返回,那么我会明确地返回 null

答案 5 :(得分:0)

Undefined与使用!==时的null不同,但在使用较弱的时候不是!=因为在这种情况下JavaScript会进行一些隐式转换。

null和undefined之间的主要区别在于undefined也可能意味着尚未分配的东西。

                            undefined   false
(SomeObject.foo)            false        false
(SomeObject.foo != null)    false        true
(SomeObject.foo !== null)   true         true
(SomeObject.foo != false)   true         false
(SomeObject.foo !== false)  true         false

这取自this weblog

答案 6 :(得分:0)

问题是你声称看到差异,但你没有。举个例子。它应该是:

var List = []; // ordered list contains data at odd indexes.
var getObject = function(id) {
    for (var i = 1; i < List.length; i+=2) {
        if (id === List[i].getId()) {
            return List[i];
        }
    }
    // returns undefined by default
}

您的算法存在缺陷,因为您检查了甚至索引(即使您知道其中没有任何内容),并且您还滥用null作为返回值。

这类函数应该真正返回undefined,因为它意味着:没有这样的数据

你处在问题的核心。如果您不完全理解nullundefined并且有时可能会错误地使用它们,那么您如何确定其他人会正确使用它?你不能。

然后 Host objects 有他们讨厌的行为,如果你问我,你最好检查两者。事实上,它并没有让您感到麻烦,它可以帮您省去处理第三方代码或上述 non-native 对象的麻烦。

除了这两种情况,在你自己的代码中,你可以做@bobince说的话:

  

undefined 保留为特殊值,以便在其他语言可能引发异常时发出信号。

答案 7 :(得分:0)

何时设置/使用它们......

请注意,没有return语句的方法返回undefined,如果在总是返回值的方法中使用它,则不应强制将其作为预期响应,那么它应该表示内部错误状态。

对故意或不匹配的响应使用null。

<小时/> 至于如何/何时检查...

undefined,null,0,空字符串,NaN和false将通过强制为FALSE。这些被称为“虚假”的价值......其他一切都是真的。

你最好的选择是强制然后测试有效的异常值......


var something; //undefined

something = !!something; //something coerced into a boolean

//true if false, null, NaN or undefined
function isFalsish(value) {
  return (!value && value !== "" && value !== 0);
}

//get number or default
function getNumber(val, defaultVal) {
  defaultVal = isFalsish(defaultVal) ? 0 : defaultVal;
  return (isFalsish(val) || isNaN(val)) ? defaultVal : +val;
}

数字测试是真正的错误,因为true,false和null可以强制转换为数字,0强制为false。

答案 8 :(得分:0)

我会将它们视为2个完全不同的值,并检查您可能知道的值。

如果您要检查某件事物是否已被赋予价值,请查看undefined

如果您正在检查该值是否为“空”,请检查“null”

一个有点人为的例子:

假设你有一系列的ajax请求,并且你在道德上反对使用回调,所以你有一个超时运行检查它们的完成。

您的支票看起来像这样:

if (result !== undefined){
    //The ajax requests have completed
    doOnCompleteStuff();
    if (result !== null){
        //There is actually data to process
        doSomething(result);
    }
}

tldr;它们是两个不同的值,undefined表示没有赋值,null表示已给出值,但值为“无”。