Javascript核心读书有感之表达式和运算符(4)

^= |= <<= >>= >>>=

  运算且赋值   R   2   lval,any→any  
,  

忽略第一个操作数,

返回第二个操作数。

  L   2   any,any→any  

i.操作数的个数

运算符可以通过操作数的个数进行分类。

javascript中的大多数运算符是二元运算符,将两个表达式合并成一个稍微复杂的表达式。
javascript也支持一些一元运算符,它们将一个表达式转换为另一个稍微复杂的表达式。表达式-x中的"-"运算符就是一个一元运算符。是将x求负值。
javascript支持一个三元运算符:条件判断运算符“?:”,它将三个表达式合并为一个表达式

ii.操作数类型和结果类型

一些运算符可以用于任何数据类型,但仍然希望它们操作指定的类型的数据。

iii.左值

在表中的赋值运算符和其它少数运算符期望它们的操作数lval类型,左值是一个古老的术语。它是指“表达式只能出现在赋值运算符的左侧”。javascript中,变量、对象属性和数组元素均是左值。ECMAScript规范允许范围内置函数返回一个左值,但定义的函数则不能返回左值。

iiii.运算符的优先级

在上表中,所示的运算符是按照优先级从高到低排序的,每个水平分隔线内一组运算符有相同的优先级。运算符优先级优先控制着运算符的执行顺序。运算符高的(表顶)的执行总是高于优先级低的(表格的底部)运算符。

看如下表达式

w=x+y*z;
乘法运算符“*”比加法“+”具有更高的优先级,所以乘法先执行。然后,由于赋值运算符“=”具有最低优先级。因此赋值操作是在右侧的表达式计算出结果后进行的。

运算符的优先级可以使用园括号来从写。以上表达式可以这样写。

w = (x + y) * z;
需要注意的是,属性访问表达式和调用表达式的优先级要比表中的所有运算符都要高。

typeof my.Function[x](y)
尽管typeof是优先级最高的运算符之一,但typeof也是在两次属性访问和函数调用后执行的。

事实上,如果你真的不确定你所使用的运算符优先级,最简单的方法就是使用园括号来强行指定运算次序。有些重要的规则则要熟记:乘法和除法高于加减法,赋值运算的优先级非常低,通常是最后执行的。

iiiiii.运算符的结合性

在本节表中,标题为A的列说明了运算符的结核性。L指从左至右结合,R指从右至左结合。结核性指定了在多个具有同样优先级的运算符表达式中的运算顺序。

例如,减法运算按照由左到右的执行结合性。

复制代码 代码如下:


w = x - y - z

和这段代码一样:

复制代码 代码如下:


w = ((x - y) - z)

反过来讲,下面这个表达式:

复制代码 代码如下:


x = ~-y;
w = x = y = z;
q=a?b:c?d:e?f:g;

和这段代码一模一样

复制代码 代码如下:


x=~(-y);
w=(x=(y=z));
q=a?b:(c?d:(e?f:g))

因为一元操作符、赋值和三元条件运算符都具有从右至左的结合性。

iiiiiii.运算顺序

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgffgj.html