表达式和运算符

73 阅读7分钟

表达式是javascript中的一个短语,javascript解释器会将其计算出一个结果。

将简单表达式组合成复杂表达式最常用的方法就是使用运算符。

1. 原始表达式

最简单的表达式、是表达式的最小的单位。包含常量或直接量、关键字和变量。

2.对象和数组的初始化表达式

对象和数组初始化实际上是新创建的对象和数组,这些初始化的表达式有时候叫做“对象直接量”和“数组直接量”。

数组直接量中列表之间的元素可以省略,空位就会填充undefined

var a=[1,,,,5]

当然,数组直接量的结尾处留下逗号,这时不会创建一个新的值为undefined的元素。

对象初始化表达式 和数组初始化表达式非常相似,只是方括号被花括号代替。并每个字表达式包含一个属性名和冒号作为前缀。当然也可以嵌套。

3.函数定义表达式

表达式的值是这个新定义的函数。从某种意义上将,函数定义表达式可以称为函数直接量。

var square = function(x){ return x*x};

函数定义表达式同样可以包含函数的名字。函数也可以通过函数语句来定义,而不是函数表达式。

4.属性访问表达式

属性访问表达式运算得到一个对象或者一个数组元素的值。javascript为属性访问定义了两种方法:

expression.indentifier
expression [expression]        //计算方括号内的表达式的值并将它转换为字符串

在"."和"["之前的表达式总会首先计算。如果计算结果为null或者undefined,表达式会抛出类型错误异常

如果属性名称是一个保留字或者包含空格和标点符号,或是一个数字(对于数组来说),则必须使用方括号的写法。当属性名是通过运算符得出的值而不是固定值的时候,这时候必须使用方括号的写法。

5.调用表达式

javascript中的调用表达式是一种调用(或者执行)函数或方法的语法表示。

f(0) //f是一个函数表达式:0是一个参数表达式。
Math.max(x,y,z)  //Math.max是一个函数;x,y和z是参数
a.sort() //a.sort()是一个函数,它没有参数。

当调用表达式进行求值的时候,首先计算函数表达式,然后计算参数表达式,得到一组参数值。

6.对象创建表达式

对象创建表达式创建一个对象并调用一个函数(构造函数)来初始化对象的属性。对象创建表达式和函数调用表达式非常类似,只是对象创建表达式之前多了一个关键字new:

new Object()
new Point(2,3)

如果对象创建表达式不需要传入任何参数给构造函数的话,那么这对圆括号是可以省略掉的。

7.运算符概述

javascript中的 运算符用于算表表达式, 比较表达式, 逻辑表达式 ,赋值表达式等

需要注意的是大多运算符都是标点符号来表示的,比如“+”、“=”;还有的是由关键字表示,比如delete和instanceof。无论是关键字运算符还是符号运算符,所表示的运算符一样都是正规的运算符。

  • 运算符可以通过操作数的个数进行分类:一元操作符、二元操作符(两个表达式合并)、三元操作符。
  • JavaScript运算符通常会根据需要对操作数进行类型转换。有一些运算符对操作符类型有着不同程度的依赖,比如加法运算符,可以对数字相加,也可以对字符串链接。
  • 副作用:前后的表达式运算会相互影响。有副作用的表达式:
    • 赋值运算符:如果给一个变量或者属性赋值,那么那些使用这个变量或属性的表达式的值都会发生变化;
    • 递增、递减也类似,因为它们包含隐式的赋值;
    • delete运算符删除一个属性就像给这个属性赋值undefined。等等
  • 运算符的优先级可以使用园括号来重写。
    • 属性访问表达式和调用表达式的优先级要所有运算符都要高。

8.算术表达式

基本的算术运算符是*、/、%、+、-。

所有那些无法转换为数字的操作都将转换为NaN值。如果操作数(或者转换结果)是NaN值,算术运算结果也是NaN。

除数为0的运算结果为正无穷大或负无穷大。而0/0的结果是NaN。所有这些运算均不会报错。

运算符“%”结果的符号和第一个操作数(被除数)符号保持一致。例如5%2的结果为1,-5%2为-1。操作数通常都是整数,但也适用于浮点数。6.5%2.1结果是0.2。

当加号运算符合字符串一起使用时,要考虑加法对运算顺序的影响。

位运算符

操作数要求是整数。表示为32位整形。

位运算符会先把操作数转为数字。再转换为32位整形,会忽略其中的小数部分以及超过32位的部分。

位运算符会将NaN、Infinity、-Infinity转为0。

  • 按位与(&): 逐位执行布尔与(AND),两个操作数的位都是1结果的这一位才是1。
  • 按位或(|): 逐位执行布尔或(OR),两个操作数的位有一个是1结果的这一位就是1。
  • 按位异或(^): 逐位执行布尔异或(XOR),两个操作数的位只有一个是1(不能同时)结果的这一位才是1。
  • 按位非(~): 逐位执行取反。
  • 左移(<<): 将所有二进制位左移,位数0~31之间。升位相当于*2。
  • 右移(>>): 将所有二进制位右移,位数0~31之间。升位相当于/2。
  • 无符号右移(>>>): 右移 + 左侧补0,去除符号。

9.关系表达式

严格相等运算符"==="首先计算操作数的值,然后比较这两个值,比较过程没有任何类型转换

  • in运算符希望它的左操作数是一个字符串或者可以转换为字符串,希望它的右侧是一个对象。
  • instanceof运算符希望左操作符为一个对象,右操作数标示对象的类。

10.逻辑表达式

逻辑运算符"&&"、“||”、“!”是对操作进行布尔算术运算。

"&&"的行为有时候被称为“短路”(short circuiting),我们经常能看到很多代码利用了这一特性来有条件的执行代码。

“!”运算符首先将其操作数转换为布尔值,然后再对布尔值求反。也就是"!"总是返回true和 false 。

11.赋值表达式

赋值操作符的结合性是从右至左

12.表达式计算

可以解释运行由javascript源代码组成的字符串,并产生一个值

eval()只有一个参数,如果传入的参数不是字符串,它直接返回这个参数。如果参数是字符串,它会把字符串当成javascript进行编译(parse),如果编译失败则抛出一个语法错误(SyntaxError)。如果编译成功,则开始执行这段代码,并返回字符串中最后一个表达式或语句的值,如果最后一个表达式没有语句或者值,则最终返回undefined。如果字符串抛出一个异常,这个异常把该调用的传给eval()。

13.其他运算符

  • javascript中的唯一一个三元运算符。
  • typeof是一元运算符,放在单个操作数前面,操作数可以是任何类型,返回值表示操作类型的一个字符串。
typeof Array   //"function"
typeof Number     //"function"
  • delete是一元操作符,它用来删除对象的属性或者数组的元素。
  • void运算符。作用:操作数会照常计算,但忽略计算结果并返回undefined,由于void会忽略操作数的值,因此在操作数具有副作用的时候使用void来让程序更具语义。常用于javascript:URL中。
  • 逗号运算符。它首先计算左操作数,然后计算右操作数,最后返回右操作数的值。常用于for循环中。