请考虑以下事项:
(编辑:我稍微修改了函数以删除三元运算符的使用或括号)
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);
}
问题: 为什么
||
运算符在这种情况下不能得到捷径?我知道Logical OR在二进制文件中的优先级最低 逻辑条件运算符,但认为它 有更高 优先级 比条件三元运算符?
答案 0 :(得分:7)
是的,||
运算符的优先级高于条件?:
运算符。这意味着它首先被执行。从您链接的页面:
运算符优先级确定运算符的计算顺序。首先评估具有更高优先级的运算符。 (MDN)enter link description here
让我们看看这里的所有操作:
step = step || (start < end) ? 1:-1;
具有最高优先级的运算符是()
分组操作。这导致false
:
step = step || false ? 1 : -1;
下一个最高优先级是逻辑OR运算符。 step
是真实的,因此导致step
。
step = step ? 1 : -1;
现在我们进行三元操作,这是唯一剩下的操作。同样,step
是真实的,所以第一个选项被执行。
step = 1;
答案 1 :(得分:0)
JavaScript是松散类型的,这意味着只要运算符或语句需要特定的数据类型,JavaScript就会自动将数据转换为该类型。
让我们看看它如何转换为其他类型
示例1。
if()语句需要一个布尔值, 因此,您在括号中定义的任何内容都将转换为布尔值。
根据这种转换的结果(即真或假),JavaScript值通常被称为“真实”或“虚假”。
请记住,如果某个值是真实的,除非它已知是假的。
幸运的是,只有六个假 -
示例2。
var x = zoo ||明星;
如果zoo评估为true,则返回zoo的值,否则返回star的值
示例3。
var str = '1' || '2';
'1'不是假的,所以将返回'1' 结果:str ='1';
示例4。
var str = '1' || (true) ? '2' : '3';
首先||(逻辑OR)运算符的优先级大于?(有条件) 运营商
首先评估第一个('1'||(真))
'1'不是假的,所以将返回'1'
中级结果:str ='1'?' 2':'3'
'1'不是真的,所以'2'将被退回
最终结果:str ='2'
示例5。
var str = '1' || (false) ? '2' : '3';
首先||(逻辑OR)运算符的优先级大于?(有条件) 运营商
首先评估第一个('1'||(false))
'1'不是假的,所以将返回'1'
中级结果:str ='1'?' 2':'3'
'1'不是真的,所以'2'将被退回
最终结果:str ='2'
现在很容易弄清楚你的情景:)