优先级:逻辑运算符或与三元运算符的比较



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

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文档中的操作员优先级?

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

运算符优先级决定运算符的求值顺序。优先级较高的运算符将首先求值。

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

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

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

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

下一个最高优先级是逻辑OR运算符。step是真的,所以它产生了step

step = step ? 1 : -1;

现在我们做三元运算,这是唯一剩下的运算。同样,step是真的,因此执行第一个选项。

step = 1;

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

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

示例1.

if()语句需要一个布尔值,因此,无论您在括号中定义什么,都将转换为布尔值。

JavaScript值通常被称为"truthy"或"false",根据这种转换的结果(即true或false)。

记住,如果一个值是真的,除非它是假的。

幸运的是,只有六个虚假

  1. false(当然!)
  2. 未定义的
  3. null
  4. 0(数字零)
  5. "(空字符串)
  6. NaN(不是数字)

示例2.

var x=zoo||star;

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

示例3.

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

"1"不是false,因此将返回"1"结果:str='1';

示例4.

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

首先,||(逻辑或)运算符的优先级大于?(有条件)操作员

因此第一个('1'||(true))将首先评估

"1"不是false,因此将返回"1">

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

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

最终结果:str='2'

示例5.

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

首先,||(逻辑或)运算符的优先级大于?(有条件)操作员

因此第一个('1'||(false))将首先评估

"1"不是false,因此将返回"1">

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

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

最终结果:str='2'

现在,在您的场景中很容易理解:)

相关内容

  • 没有找到相关文章

最新更新