Javascript 我可以使用(undefined | | null)检查变量是否为null或undefined吗?

Javascript 我可以使用(undefined | | null)检查变量是否为null或undefined吗?,javascript,null,undefined,Javascript,Null,Undefined,在我的Javascript代码中,我正在检查一个变量是未定义的(不是未定义的值,而是未定义的变量)还是null。为了修剪代码,我使用了运算符。我就是这样做的: if (myVariable === (undefined || null)) { // Do something. } 我的一位朋友曾经告诉我,我宁愿把支票分成: if (myVariable === undefined || myVariable === null) { // Do something. } 这两种

在我的Javascript代码中,我正在检查一个变量是未定义的(不是未定义的值,而是未定义的变量)还是null。为了修剪代码,我使用了运算符。我就是这样做的:

if (myVariable === (undefined || null)) {
    // Do something.
}
我的一位朋友曾经告诉我,我宁愿把支票分成:

if (myVariable === undefined || myVariable === null) {
    // Do something.
}

这两种方法之间真的有什么区别吗?如果是,我应该使用哪一个?为什么?

这是因为
(未定义的| null)
总是计算为
null
,所以当
myVariable
未定义时,您的第一个表达式总是false。第二个变量是正确执行所需操作。

==
JS中的运算符比较两个操作数(值)

myVariable==(未定义的| | null)
的情况下,操作数是:
myVariable
,表示它所持有的值,以及
(未定义的| null)
表示值
null
,因为在比较之前必须对操作数(表达式)求值。而
(未定义的| null)
表达式的计算结果为
null

因此,您的解决方案实际上与
myVariable===null
相同

如果你遵循同样的想法,评估你朋友的建议,你会发现他的建议是正确的。

首选:
If(typeof myVariable==“undefined”| | myVariable==null){

因为使用
if(myVariable==undefined){
可以返回错误或警告

像这样:

ReferenceError:未定义myVariable
如果(myVariable==未定义){

PS:
(未定义的| | null)
总是null(因为未定义的返回值false

这两种方法之间真的有什么区别吗

相当于

myVariable === null
仅当myVariable为null时为true,如果myVariable未定义时为false。鉴于:

myVariable === undefined || myVariable === null
如果myVariable未定义或为null,则返回true

如果是,我应该使用哪一个?为什么

两者都不是(可能),即使答案是肯定的。如果您试图确定某个变量是否存在,您只能测试全局变量,因为它们是全局对象的属性:

// In global code
var window = this;

// Later…
if (varname in window) {
  // varname is a global variable or property
}
在函数执行上下文中,只能使用try..catch可靠地测试变量:

try {
  var blah = foo;
} catch (e) {
  // foo is probably not a variable in scope
}
但这几乎肯定不是一个好主意

您可能应该:

if (typeof varname == 'undefined' || varname === null) {
  // varname either does't exist or has a value of undefined or null.
}

测试需要按照这个顺序进行,这样,如果没有声明或以其他方式创建varname,则测试类型在null测试之前失败,否则会引发错误。

是的。例如,
undefined
等于
false
,那么
null
也等于
false
,最后一个值也等于
false
这就是为什么第一种方法等于
if(myVariable==null){…}
。第二种方法更可取,但如果你不是一个“JavaScript:The Good Parts”的家伙,你可以坚持
if(myVariable==null){…}
if(myVariable==undefined){…}

Lol…不,这行不通。编写一个这样的帮助函数:
函数IsNullOrUndefined(obj){return obj==null | | | typeof obj==='undefined';}
@WoIIe:“这行不通”--什么“这”?第二个将。@zerkms只是一切……检查
myVariable===undefined
并不会检查myVariable是否未定义。而且由于
(undefined | | true)
将始终返回false,因此他只需检查inf
myVariable==false
。@Wolle-“那”也不起作用。如果变量尚未声明或初始化,尝试访问它的值将在调用函数时抛出错误。@WoIIe:“检查变量===未定义将不起作用”---你为什么这么认为?如果你在继续这个毫无意义的讨论之前试一试呢?你为什么要使用未声明的变量?这不是很愚蠢吗?@Hors:谢谢你的提示!@zerkms因为我检查变量是否是未定义的。未定义=未声明的变量。@Hors Sujet:不。我的问题:为什么有人要编写一个检查变量的代码没有声明的变量。这很愚蠢。如果你没有声明一个变量,那么你就不需要检查它是否未定义。这是一个解析时间检查,没有理由在运行时检查它。完全正确。使用未声明的变量没有意义,但在我的情况下,我必须检查是否声明了一个变量。除非没有定义myVariable,那么
myVariable===undefined
将抛出一个错误(对于偏执狂来说,undefined可能被分配了一些其他值),而
typeof myVariable=='undefined'
执行大致相同的测试,但没有(并防止
myVariable==null
也抛出一个错误)。:-@RobG:“除非myVariable未声明”@zerkms,除非myVariable未通过赋值创建、声明或包含在正式参数列表中。是否有较短的表达式?;-)可能“如果标识符myVariable不在范围内“?@RobG:如果它是作为参数传递的,那么
变量===undefined
将不会引发异常。只有在未声明变量时,它才会引发异常。
if (typeof varname == 'undefined' || varname === null) {
  // varname either does't exist or has a value of undefined or null.
}