[Bounty Edit]
我正在寻找一个很好的解释,你应该设置/使用null
或undefined
以及你需要检查它的位置。基本上这两种常见的做法是什么,并且真的可以在通用的可维护代码中单独处理它们?
我何时可以安全地检查=== 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?
}
这只是我可以同时使用null
或undefined
的一个示例,我不知道哪个是正确的。
在任何情况下,您必须检查null
和undefined
,因为您别无选择吗?
答案 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
您永远不必检查undefined
或null
(除非您汇总来自可能返回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)
null
和undefined
之间的区别在于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
,因为它意味着:没有这样的数据
你处在问题的核心。如果您不完全理解null
和undefined
并且有时可能会错误地使用它们,那么您如何确定其他人会正确使用它?你不能。
然后 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
表示已给出值,但值为“无”。