构造 x = x || y 的意思是什么?

308

我正在调试一些JavaScript代码,但不确定 || 的作用:

function (title, msg) {
  var title = title || 'Error';
  var msg   = msg || 'Error on Request';
}

为什么这个人要使用 var title = title || 'ERROR'?有时我也看到它没有 var 声明。


52
人们已经回答了这个问题,但需要非常注意的是,如果第一个值为“假值”(falsy),而不仅仅是“未定义”(undefined),则将选择第二个值。我已经看到过很多像“doWeDoIt = doWeDoIt || true”的代码,这让我感到非常难过。(也就是说,doWeDoIt现在永远不会是false) - Matt
6
对于有C#经验的人来说,双竖线运算符相当于空值合并运算符 ?? 。JavaScript 对非空对象的求值类似于 true(或更好地将空对象评估为 false)。 - usr-local-ΕΨΗΕΛΩΝ
4
不要难过 - JS是唯一允许这种可怕编码的愚蠢语言...还有教导将每个函数嵌套到代码行中并将它们丢弃使其不可重复使用。我从事编码已经30年了,直到不久前我才开始接触JS,我感同身受。我的建议是:准备一个“毫无意义,只有在JS中才有”的提示表,这是我解决问题的唯一途径! :) - Collin Chaffin
2
请考虑将接受的答案更改为我的答案 - Michał Perłakowski
1
@usr-local-ΕΨΗΕΛΩΝ - 我看到了那个日期,并且我涵盖了那个时间范围:在添加之前,与null-coelesce的正确等效是value!= null?value:YOUR_DEFAULT。使用||作为null coalesce从来不是一个好习惯。如果您遇到任何“falsey”值,但认为它是“非空”而不是“非falsey”,则会出现微妙的错误。也许称||为“truthy coalesce operator”? :) - ToolmakerSteve
显示剩余9条评论
12个回答

2

引用:“x = x || y 这个结构是什么意思?”

赋予默认值。

这意味着在x仍在等待其值但尚未收到它或者被故意省略以回退到默认值的情况下,为x提供y的默认值


这就是该结构的确切含义,也是唯一的含义。它被广泛地用作子程序,用于编写可以作为原型、独立函数和借用方法应用于另一个元素的函数。 其主要且唯一的职责是修改目标的引用。 例如:function getKeys(x) { x = x || this ; .... } 可以作为独立函数使用,也可以作为原型的属性方法使用,还可以作为一个元素的方法使用,该元素可以获取另一个元素作为其参数,如 [element].getKeys(anotherElement); - Bekim Bacaj

-5
我还要补充一点:这种简写方式是可恶的。它误用了一个意外的解释器优化(如果第一个操作为真,则不需要关心第二个操作)来控制赋值。这种用法与运算符的目的无关。我认为它永远不应该被使用。
例如,我更喜欢三元运算符进行初始化。
var title = title?title:'Error';

这个代码使用了一行条件操作符来实现其正确的目的。虽然它仍然在处理真值时表现得不太美观,但这就是 JavaScript。


短路布尔运算符曾受到Edsger W. Dijkstra等人的批评,但它们已经存在很长时间,并且在许多编程语言中得到支持,包括C、Pascal(仅限Turbo Pascal?)、Perl、C#、Go、Kotlin、Python等。例如,Python 只有 短路布尔运算符。 - Peter Mortensen

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