我能用(undefined || null)来检查变量是否为null或undefined吗?

6

在我的Javascript代码中,我正在检查一个变量是否未定义(不是undefined的值,而是变量未定义)或为空。为了简化代码,我使用了一个操作符。这是我所做的:

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

一位朋友曾经告诉我,我应该将账单拆分为:
if (myVariable === undefined || myVariable === null) {
    // Do something.
}

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

2
哈哈...不,这样行不通。编写一个辅助函数,如下所示:function IsNullOrUndefined (obj) { return obj === null || typeof obj === 'undefined'; } - ˈvɔlə
@WoIIe:“这个不行”--指的是哪个“这个”?第二个会起作用。 - zerkms
@zerkms 仅仅是所有的东西... 检查 myVariable === undefined 并不意味着检查 myVariable 是否为未定义。而且,由于 (undefined || true) 总是返回 false,他只是在检查 myvariable === false ... - ˈvɔlə
@Wolle - “那个”也不行。如果一个变量没有被声明或初始化,尝试访问它的值将在调用函数时抛出错误。 - RobG
@zerkms 你绝对不能不使用 typeof() 函数就检查类型...千万别这样做...这是不正确的。由于 undefined 是 JavaScript 中的一种类型,你需要检查变量的类型而不是其值 -.-# - ˈvɔlə
显示剩余6条评论
5个回答

11

这两种方法真的有区别吗?

有。

myVariable === (undefined || null)

等同于

myVariable === null

这只有在myVariablenull时才为真,而myVariableundefined时则为假。相反:

myVariable === undefined || myVariable === null

如果myVariableundefinednull,则返回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
}

但这几乎肯定不是一个好主意。请参见 JavaScript检查变量是否存在(已定义/已初始化)-哪种方法更好?

你应该使用以下代码:

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

测试需要按照这个顺序进行,以便如果“varname”未被声明或创建,typeof测试会在null测试之前失败,否则会引发错误。

3

首选: if (typeof myVariable === "undefined" || myVariable === null) {.

variable === undefined vs. typeof variable === "undefined"

因为使用 if (myVariable === undefined) { 可能会导致控制台返回错误或警告。

例如:

ReferenceError: myVariable is not defined
    if (myVariable === undefined) {

enter image description here

请注意:(undefined || null)始终为null(因为undefined返回false)。


为什么要使用未声明的变量?这不是很愚蠢吗? - zerkms
1
@zerkms 因为我检查变量是否未定义。undefined = 未声明的变量。 - user2226755
1
@Hors Sujet:不是这个话题。我的问题是:为什么有人会写一个检查未声明变量的代码。这很愚蠢。如果你不声明一个变量-那么你就不需要检查它是否未定义。这是一个解析时检查,没有理由在运行时检查它。 - zerkms
也许 myVariable 是一个对象的属性,就像这样 obj.myVariable - user2226755
@Hors Sujet:如果它是一个属性 - 那么你使用'myVariable' in obj,而不是与undefined进行比较。 - zerkms
显示剩余5条评论

2

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

对于myVariable === (undefined || null),操作数是:myVariable,它代表它所持有的值,和(undefined || null),它代表值null,因为在比较之前必须评估操作数(表达式)。而(undefined || null)表达式被评估为null

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

如果你按照相同的思路评估你朋友的建议,你会发现他的建议是正确的。


除非myVariable未定义,否则myVariable === undefined将会抛出一个错误(对于偏执者而言,undefined可能已被分配其他值),而typeof myVariable == 'undefined'执行的测试基本相同,但不会抛出错误(也可以防止myVariable === null抛出错误)。 :-) - RobG
@RobG:“除非我的变量没有被声明 - zerkms
@zerkms,除非 myVariable 已被分配、声明或包含在形式参数列表中。有没有更短的表达方式?;-) 也许是“如果标识符 myVariable 不在作用域内”? - RobG
@RobG:如果它作为参数传递,那么variable === undefined不会抛出异常。只有在变量未声明时才会抛出异常。 - zerkms

1
这是因为(undefined || null)总是被评估为null,所以当myVariable未定义时,你的第一个表达式总是假的。第二个变量可以正确地执行你想要的操作。

1
是的,确实是这样。对于你的例子,undefined等于false,那么null也等于false,并且这个最后的值从表达式中返回。所以这就是为什么第一种方法等同于if (myVariable === null) { ... }。第二种方法更可取,但如果你不是《JavaScript权威指南》的粉丝,你可以使用if (myVariable == null) { ... }if (myVariable == undefined) { ... }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接