var a ; a&&a.c==1 为什么不报错?

优先级   . 大于== 大于&&

按优先级解释, 为什么不先算 a.c==1 ?

符号优先级

回答

你不能只看运算符,你的看表达式, && 后面是一个表达式, xxx && xxxx 是一个表达式,两个表达式怎么能一起算优先级?

因为优先级和求值顺序无关,大多数运算符结合性是从左到右,只有三个优先级是从右至左结合的,单目运算符、条件运算符、赋值运算符,所以 && 是从左到右的
运算符优先级 - mdn

&&是逻辑与运算,逻辑与是一种短路逻辑,如果左侧表达式为 false,则直接短路返回结果,不再运算右侧表达式,就是这么定义的,运算逻辑如下:

第 1 步:计算第一个操作数(左侧表达式)的值。
第 2 步:检测第一个操作数的值。如果左侧表达式的值可转换为 false(如 null、undefined、NaN、0、""、false),那么就会结束运算,直接返回第一个操作数的值。
第 3 步:如果第一个操作数可以转换为 true,则计算第二个操作数(右侧表达式)的值。
第 4 步:返回第二个操作数的值。

还有一句话比较重要,优先级与求值顺序无关。如a+b && b*c,虽然*优先级最高,但这个表达式求值顺序是从左到右。

  1. && 运算,左边为true才会执行右边, a为undefined(转换后为false)
  2. 你试一下 true && a.c == 1 便会执行右边的运算,就会报错

首先从左到右 符号优先级也要同级(同个段位? 大概就这么个意思)比较吧
&&是会 阻塞(中断?)右侧信息的, 所以这个根本就没到解析a.c的时候

以上是 var a ; a&&a.c==1 为什么不报错? 的全部内容, 来源链接: utcz.com/a/29228.html

回到顶部