4

考虑以下内容:(
编辑:我稍微修改了函数以删除使用三元运算符的使用或大括号)

function someFunction(start,end,step){
  var start = start || 1,
      end = end || 100,
      boolEndBigger = (start < end);   // define Boolean here
      step = step || boolEndBigger ? 1:-1;
  console.log(step); 
}

someFunction()
// step isn't defined so expect (1<10) ? 1:-1  to evaluate to 1

someFunction(1,10)  
// again step isn't defined so expect to log 1 as before

问题:

someFunction(1,10,2) 
//step IS defined, shortcut logical OR || should kick in, 
//step should return 2 BUT it returns 1

我知道这很容易通过使用大括号来解决:

function range(start,end,step){
  var start = start || 1,
      end = end || 100,
      step = step || ((start < end) ? 1:-1);
  console.log(step); 
}

问题:在这种情况下, 为什么||操作员没有捷径?

我知道逻辑 OR 在二元逻辑条件运算符中的优先级最低,但认为它的优先级高于条件三元运算符?

我是否误读了MDN 文档中的运算符优先级

4

2 回答 2

10

是的,||运算符的优先级高于条件?:运算符。这意味着它首先被执行。从您链接的页面:

运算符优先级决定了运算符的计算顺序。首先评估优先级较高的运算符。

让我们看看这里的所有操作:

step = step || (start < end) ? 1:-1;

具有最高优先级的运算符是()分组操作。在这里它导致false

step = step || false ? 1 : -1;

下一个最高优先级是逻辑 OR 运算符。step是真实的,所以它导致step.

step = step ? 1 : -1;

现在我们进行三元运算,这是唯一剩下的一个。同样,step是真实的,所以第一个选项被执行。

step = 1;
于 2017-02-03T14:18:57.467 回答
1

JavaScript 是松散类型的,这意味着每当操作符或语句需要特定的数据类型时,JavaScript 都会自动将数据转换为该类型。

让我们看看它如何转换为其他类型的一些场景

示例 1。

if() 语句需要一个布尔值,因此您在括号中定义的任何内容都将转换为布尔值。

根据这种转换的结果(即真或假),JavaScript 值通常被称为“真”或“假”。

记住一个值是否为真,除非已知它是假的。

幸好只有六个假的——

  1. 错误的(当然!)
  2. 不明确的
  3. 空值
  4. 0(数字零)
  5. ""(空字符串)
  6. NaN(不是数字)

例 2。

变量 x = 动物园 || 星星 ;

如果 zoo 评估为 true,则返回 zoo 的值,否则返回 star 的值

例 3。

var str = '1' || '2';

'1' 不是假的,所以 '1' 将返回结果:str = '1';

例 4。

var str = '1' || (true) ? '2' : '3';

首先||(逻辑或)运算符的优先级大于?(条件)运算符

所以首先 ( '1' || (true) ) 将首先被评估

'1' 不是假的,所以会返回 '1'

中间结果:str = '1' ?' 2':'3'

'1' 不真实,因此将返回 '2'

最终结果:str = '2'

例 5。

var str = '1' || (false) ? '2' : '3';

首先||(逻辑或)运算符的优先级大于?(条件)运算符

所以首先 ( '1' || (false) ) 将首先被评估

'1' 不是假的,所以会返回 '1'

中间结果:str = '1' ?' 2':'3'

'1' 不真实,因此将返回 '2'

最终结果:str = '2'

现在很容易在你的场景中弄清楚:)

于 2018-06-18T21:40:09.700 回答