JavaScript中的双竖线(||)在抛出错误而不是作为假值进行评估。

22

我读到在JavaScript中,双竖线用于检查一个变量是否为假值,undefined 是 JavaScript 中的一种假值,例如:

这意味着如果值是假值(例如 0、""、null、undefined(请参见JavaScript中所有假值)),它将被视为false; 否则,它被视为true。

因此,我尝试了一下,发现 undefined 确实没有被解释为假值,而是会抛出一个错误:

let elemContent = document.getElementById('content');

let a = null;
let b = 2;

elemContent.innerHTML += a || 'ok'; // "ok"
elemContent.innerHTML += b || 'ok'; // "2"
elemContent.innerHTML += whatever || 'ok'; // "ERROR: whatever is not defined"

undefined在JavaScript中是一种假值还是不是,或者如何理解这个矛盾?

http://jsfiddle.net/ueqo6yko


1
window.whatever 替换 whatever 或者声明 whatever - Wiktor Zychla
1
为什么没有人指出双竖线实际上是“否则”。这个语句的意思是:先评估第一个条件,如果第一个条件不为假,则返回该值,否则评估第二个条件并返回其值。像任何条件一样,它很危险,因为0的有效值被评估为假,所以最好希望a或b永远不会为零,否则将评估第二个条件。 - Frank Cedeno
5个回答

37

由于在您的代码中,whatever 不仅是 undefined,而且还未声明

为避免此错误,您可以执行以下操作:

let elemContent = document.getElementById('content');

let a = null;
let b = 2;

elemContent.innerHTML += a || 'ok'; // "ok"
elemContent.innerHTML += b || 'ok'; // "2"
elemContent.innerHTML += (typeof whatever !== 'undefined' && whatever) || 'ok3'; // "ok3"

1
是的,elemContent.innerHTML += undefined || 'ok' 可以工作。 - Kokodoko
7
@laruiss 这一行代码可能会引起很多混乱。 - Kokodoko
1
天啊@laruiss你是想让 OP 把头发都拔光吗? :) 除非你想让其他程序员读你的代码时骂你,否则永远不要把变量命名为 'undefined'! :) 而且@Kokodoko,你的例子很复杂,写起来就相当于 elemContent.innerHTML += 'ok' :) - Stijn de Witt
嗨@StijndeWitt和大家!首先,这主要是为了好玩,而且不,我没有写那种疯狂的东西:-D 但这是对该语言的一个(众多)wtf的提醒......尽管如此——或许正因为如此——我真的很喜欢它。 - laruiss
@StijndeWitt 我的例子是为了证明 undefined 是假值,这是提问者的问题 :) - Kokodoko
@laruiss,是的,我看到了你的代码,所以我相信你自己能理解它,但对于初学者来说,其中的幽默和玄妙可能会被忽略 :) - Stijn de Witt

13

undefined 确实是假值,但在 JavaScript 中,在变量声明之前使用变量是错误的。

请添加 let whatever = undefined 到任意位置以查看您所期望的行为。


8

undefinednot defined 的错误是不同的。当一个变量被声明但未赋值时,它的值就是 undefined;而 not defined 错误则表示你使用了未声明的变量。

以下是关于 undefined 的示例:

let elemContent = document.getElementById('content');

let a = null;
let b = 2;
let whatever;

console.log(whatever)

elemContent.innerHTML += a || 'ok'; // "ok"
elemContent.innerHTML += b || 'ok'; // "2"
elemContent.innerHTML += whatever || 'ok'; // "whatever is undefined"
<div id="content"></div>

一个出现了未定义错误的例子:

let elemContent = document.getElementById('content');

let a = null;
let b = 2;

elemContent.innerHTML += a || 'ok'; // "ok"
elemContent.innerHTML += b || 'ok'; // "2"
elemContent.innerHTML += whatever || 'ok'; // "ERROR: whatever is not defined"
<div id="content"></div>

以下是一个示例,您可以检查变量是否已声明并且它是否有值(而不是undefined):

let test = "test";

if (typeof test !== undefined) {
  console.log("'test' is declared");
  if(test) {
    console.log("'test' has a value (not 'null', 'false', 'undefined'...)");
  }
}


2

确认undefined是虚假的:

var whatever = undefined;
console.log(whatever || "undefined is really falsy");


0
let elemContent = document.getElementById('content');

let a = null;
let b = 2;
let c;


elemContent.innerHTML += a || 'ok'; // "ok"
elemContent.innerHTML += b || 'ok'; // "2"
elemContent.innerHTML += c || 'ko'; // "ko"
elemContent.innerHTML += whatever || 'ok'; // "ERROR: whatever is not defined"

c是未定义的。无论什么是未声明的


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