我总是不确定哪一个是正确的以及哪些是正确的。
通常我会(obj == null)
检查。我觉得最好问一下。
我将使用以下哪一项:
if (obj == null) {
alert('obj is null');
}
OR
if (obj == null || obj == 'undefined') {
alert('obj is null or undefined');
}
OR
if (obj == null || obj == undefined) {
alert('obj is null or undefined');
}
OR
if (obj == null || obj === 'undefined') {
alert('obj is null or undefined');
}
哪一个更好,我们真的需要检查未定义吗?
答案 0 :(得分:1)
只做
if (obj == null) {
这将检查null
和undefined
。
对于困惑的下注者,使用== null
会同时检查null
和undefined
,但没有其他“假名”值。
typeof foo === "undefined"
语法实际上会导致比修复更多的错误。像这些......
typeof foo === undefined // common bug
foo === "undefined" // common bug
typeof foo === "undefnied" // common bug
这些是非常常见的错误,并且是不使用此语法的原因。
以下是初学者被告知使用该语法的案例......
undefined
可能已被重新定义
您的变量可能未声明,导致 ReferenceError
这些原因不是很好的原因
无法在现代浏览器中重新定义全局undefined
,因此这不是问题。即使它确实被重新定义,然后某些东西是非常错误的,并且需要以任何方式修复。如果你隐藏了这个问题,你就永远无法修复它。
如果开发人员尝试使用未声明的本地变量,则表示代码中存在错误, ReferenceError 应视为< em>理想的警告,而不是隐藏的东西。
如果开发人员试图使用事先无法知道的未声明的全局变量,那么检查变量作为window
上的属性会更安全对象而不是使用不安全的typeof foo === "undefined"
语法。
是的,null
和undefined
之间存在类型区别,因此需要进行检查。当类型不匹配时,==
运算符执行类型强制算法。这就是为什么你可以使用== null
来检查两者。
答案 1 :(得分:1)
您已经确定了四项测试:
if (obj == null)
if (obj == null || obj == 'undefined')
if (obj == null || obj == undefined)
if (obj == null || obj === 'undefined')
其中,第一个和第三个表现相同。 (obj == null
如果true
未定义,则obj
将评估为obj
。) * 第二个和第四个不执行您想要的任务,因为测试将成功如果'undefined'
是字符串 obj
(以及未定义obj == null
时,感谢obj === null
的行为方式)。
至于是否需要测试undefined,这取决于您是否需要区分未定义的值和空值。在大多数应用程序中,您不需要这样做。如果您确实需要这样做,则应使用obj === undefined
和if (typeof obj === 'undefined')
。
如果您需要防范未声明的变量,那么您可以使用:
obj === null
但除了最不寻常的情况外,您应该在给定的上下文中知道是否已声明变量。
* 但是,如果false
未定义,obj
将评估为{{1}}。
答案 2 :(得分:0)
undefined
是一个单词,意思是not defined
。
null
是一个对象
让我们看看这段代码
function saySomething(thing) {
if(thing === undefined) {
sayRandomThing();
}else {
sayThat(thing);
}
}
在这种情况下,我会检查是否给出了参数,或者换句话说,是否定义了参数。
请注意,声明了变量名thing
,但未对其进行定义。因此,在这种情况下thing === undefined
就足够了,您不需要做更详细的typeof thing === "undefined"
。
没有理由使用null
这个词。因为null
是一个对象,它与我们的thing
无关。
再说一遍。如果您不知道是否声明了变量,则需要typeof thing === "undefined"
。但是,正如documentation say:
但是,应该避免使用这种技术。 JavaScript是一种静态范围的语言,因此可以通过查看是否在封闭的上下文中定义来了解变量是否已定义。唯一的例外是全局范围,但全局范围绑定到全局对象,因此可以通过检查全局对象上是否存在属性来检查全局上下文中是否存在变量(使用in运算符,例如)
我应该何时使用null
?
来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null
在API中,通常会在可以预期对象但没有对象相关的位置检索null。
null
是一个对象。当一个函数返回一个对象或一个数组时,Javascript核心使用null
,但在某些情况下应该告诉我们“找不到对象”(空对象{}
的不同情况意味着:我已经找到了这个对象,它是空的)。例如,方法match
就属于这种情况。
var matches = "My awesome string".match("don't match anything");
console.log(matches === null); // true
在您的脚本中,您知道,作为开发人员,变量应该是什么类型。你应该知道应该使用哪种条件。记住:
if(typeof varName === "undefined")
。if(varName === undefined)
。if(varName === null)
需要严格相等运算符(===
),因为varName == undefined
还会检查varName
是否为空
答案 3 :(得分:-1)
如果您想检查相关对象的存在并阻止各种JS erorrs,请使用以下内容:
if (typeof(abc) === 'undefined') {
console.log('not defined');
}
jsFiddle证明有用性:http://jsfiddle.net/tJyfg/1/
如果您要查看全局变量,那么以下内容将使用typeof()
执行不使用的技巧(适用于所有对象) ...
if (!window.abc) {
console.log('not defined');
}