javascript三元运算符

var a = 123;
a = a > 100 ? 100 : a < 50 ? 50 : a
a;  // 100
var a = 123;
a = (a > 100 ? 100 : a < 50) ? 50 : a
a; // 50

为什么第二段代码输出的是50

阅读 4.8k
6 个回答

首先是()起了一个表达式的作用,代码会优先执行,也就将括号内的代码当做表达式来执行,就是直接当作代码做运算,所以执行完了已经赋值,(a > 100 ? 100 : a < 50)会优先执行,在执行后半部分

  1. 列表项目

  2. 123大于100,走前半部分,a=100,a已经赋值

  3. a=100为true所以a=100?50:a会走前半部分

  4. a=50

至于第一个例子,因为没有(),所有后半部分a < 50 ? 50 : a根本不用执行

var a = 123;
a = (a > 100 ? 100 : a < 50) ? 50 : a
a; // 50

一点点拆分,a > 100 ? 100 : a < 50,由于a123,所以前面的表达式结果是100
那么就变成a = 100 ? 50 : a,那结果当然是50

<表达式1> ? <表达式2> : <表达式3>; "?"运算符的含义是:先求表达式1的值,如果为真,则执行表达式2,并返回表达式2的结果;如果表达式1的值为假,则执行表达式3,并返回表达式3的结果。
a > 100 ? 100 : a < 50 的结果为100,所以就变成了a = 100 ? 50 : a; 100肯定为真,所以三目运算的结果就为50

第二段可以翻译成:
临时变量 tmp
if(a>100){
tmp=100;
}else{
tmp=a<50;
}

if(tmp){
a=50;
}else{
a=a;
}

很明显 第一个 a>100 成立所以 tmp=100 为 true 所以返回 a=50

括号里面是true所以输出50啦 (a>100?100:a<50)==>100==>true

因为a=123,括号里面的值是100,100=true,然后a就等于50,就酱,只是比较绕而已

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题