JavaScript || 函数语法

3
我正在尝试理解以下代码块的语法(摘自Angular文档,表示使用angular noop作为空函数)
```javascript function noop() {} ```
这段代码定义了一个名为`noop`的空函数。
function foo(callback) {
  var result = calculateResult();
  (callback || angular.noop)(result);
}

我不理解 '||' 语法。我试着查找,但搜索困难,也不确定该搜索什么。
如果将其视为“OR”语法,那么如果将函数分配给回调或将函数分配给angular noop,则等于true,然后在true上调用函数。但显然这是错误的。
提前为这个问题的新手性道歉。
- 编辑 -
进一步澄清,我从示例中猜测出它的功能。然而,我正在尝试弄清楚JavaScript规则说什么会导致(callback1 || callback2)的返回语句返回一个函数对象,而不是布尔值(由于在示例中可以调用子表达式的返回)。
2个回答

5

这部分

(callback || angular.noop)(result);

缩写为:

if (callback) { 
    callback(result); 
} else {
    angular.noop(result); 
}

它利用了 || 惰性执行的特点。你要查找的搜索词是 惰性求值。为了解释它的工作原理,我们可以看一下 ECMAScript 规范,具体来说是 11.11 二元逻辑运算符

&&|| 运算符产生的值不一定是 Boolean 类型。产生的值将始终是两个操作数表达式之一的值。请注意,这并不意味着您不能依赖于这样的表达式:

if (a || b) // <-- logical expression will evaluate to the value of a or b, NOT true or false

由于JavaScript将布尔值评估为真值或假值,正式定义为ECMAScript规范中的ToBoolean()操作。

来自9.2 ToBoolean

抽象操作ToBoolean根据表11将其参数转换为布尔类型的值:

 Argument         
   Type           Result

 Undefined        false
 Null             false
 Boolean          The result equals the input argument (no conversion).
 Number           The result is false if the argument is +0, −0, or NaN; 
                      otherwise the result is true.
 String           The result is false if the argument is the empty String 
                      (its length is zero); otherwise the result is true.
 Object           True

在你的帮助下,我想我解决了我的问题。你能否提醒一下,|| 操作的返回值不是布尔值,而是实际的值,仅供参考?我提前接受你的答案。 - ThinkBonobo
@ThinkBonobo 这里的最佳答案 http://stackoverflow.com/questions/3088098/in-javascript-what-does-it-mean-when-there-is-a-logical-operator-in-a-variable 解释得比我更简洁明了。 - jdphenix

5

基本上,这个语句:

(callback || angular.noop)(result);

可以理解为:

调用函数callback或者angular.noop并将参数result传入。

如果未定义callback,OR(||)运算符的结果将是调用angular.noop函数并将变量result传递给这个函数。

angular.noop()函数是一个什么都不做的函数。更多信息请参见https://docs.angularjs.org/api/ng/function/angular.noop


谢谢。|| 实际上返回的是一个函数而不是布尔值。明白了这一点,现在整个代码都变得清晰易懂了。 - ThinkBonobo

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