Skip to content

在前面介绍了 JS 中数据是如何存储的,现在读者应该都清楚是用变量来存储,这些数据如果只是单纯存在内存中肯定是没用的,我们需要对其进行一些处理,这就是运算符的内容。

运算符其实很好理解,就是对数据进行处理的符号,比如加法减法这些都是运算符,运算符我们也称为操作符,操作符一定是和操作数相辅相成的,因为操作符本身就是对数据进行操作,被操作的数据就叫操作数,例如 1+1 中,这两个 1 就是操作数,加法就是操作符。

操作数也称为元

操作符不一定只有一个符号,可能是多个符号,并且操作符出现在不同的位置也可能具有不同的含义。

目前接触到的操作符有下面几个

  • =:赋值操作符,将等号右边的数据赋值给等号左边的变量。
  • .:用于访问对象的属性
  • []:用于访问对象的属性
  • (): 函数调用

运算符通常一般有两个维度,可以按操作数数量区分,也可以按照功能区分

按操作数数量,有几个操作数就是几元运算符

  • 单元运算符
  • 二元运算符
  • 三元运算符

按照功能区分

  • 算术运算符
  • 比较运算符
  • 逻辑运算符
  • 位运算符
  • 其他运算符

运算符和操作数是相辅相成的,即有运算符就一定会有操作数,那么运算符和操作数放在一起,我们就称其为一个表达式(没有运算符的单独数据我们也称为表达式,包括变量),例如 1+1 就是一个表达式,例如 console.log("a") 也是一个表达式,在程序中绝大部分内容都是由表达式组成的。

每一个表达式都会有一个运算结果,例如 1+1 的运算结果是 2,那么函数调用,比如 console.log() 既然作为一个表达式,也应该有一个返回结果,我们使用 console.log(console.log()); 可以验证,console.log() 的运算结果为 undefined,这个运算结果我们一般也称为返回值。

返回值肯定有类型吧,比如 1+1 返回的是一个数字 2,而"2"返回的是一个字符串的 2,虽然它们都是 2,但是本质上是不一样的,一个是可以参与运算的数字,一个是单纯的一个文本,一个表达式返回值的数据类型,我们称为返回类型。

为什么要引入表达式这个概念呢,因为表达式本质上就是数据,或者说所有的表达式都可以当做数据使用。这个性质非常重要,当我们知道表达式可以当做数据进行使用,其实我们也就知道为什么变量可以直接当做数据了,包括 console.log() 这种函数调用本身也可以当做数据。

js
var obj1={
	a:1,
};
var obj={
	a:obj1.a,
}

obj1.a 本身作为一个表达式,这个表达式的值为 1,所以它就可以替代数据 1,可以放在任何可以放数据的地方。

其实表达式并没有那么复杂,只需要知道,绝大多数语句都是表达式,表达式一定有一个返回值,表达式本身就可以直接当这个返回值使用就完事了,例如 console.log() 就是一个表达式,返回值为 undefined,所以它就可以在任何时候当做 undefined 使用,例如 var a = console.log(),此时 a 的值就是 undefined,其他的表达式也一样,都可以当做数据使用。

常见表达式的返回值:

  • =:赋值运算符,返回赋值的内容,例如 var a = (b = 2); 此时将 b 赋值为了 2,然后将这个赋值表达式的返回值赋值给了 a,此时 a 的值就是 2。格外注意:如果是声明+赋值的表达式,返回结果为 undefined,例如 var a = 1; 这个表达式的值为 undefined,不同于 a = 1;
  • .:属性访问表达式,这个其实就是取对象上的某个属性,返回值肯定是属性的值,读者可以这样理解,通过 . 访问属性,相当于就是将对象中的这个属性当做变量提取出来用,例如 obj.a 就是把 obj 对象里的 a 属性拿出来用了,此时 obj.a 完完全全就是一个变量。
  • []: 属性访问表达式,返回属性的值。
  • (): 函数调用表达式,返回值取决于函数本身的设计,在写函数的时候我们可以指定其返回值,像 console.log() 这个函数返回结果都是 undefined。

我们知道赋值运算符的返回值之后,就可以掌握一种很方便的写法,即给多个变量赋同一个值,例如 var a = b = c = 1;,这个表达式会先执行 c = 1,然后 c = 1 的返回值为 1,然后就会执行 b = 1,这个表达式返回结果又是 1,然后执行 var a = 1。
赋值表达式的运算顺序是从右往左的。

读者可以在 chrome 控制台里直接书写表达式:
fa34a186093a1e79c468b135822d99f7_MD5
这里就很有意思了,我只让他执行 console.log(1),按理说它应该只会输出一个 1,为什么后面会输出一个 undefined 呢,这就 chrome 控制台环境的问题了,chrome 控制台是 REPL 环境,在这个环境下,在执行完表达式之后,会输出这个表达式的返回值。
e093fa9e2857c52774faf0c4980f98f8_MD5
例如这个表达式,给 a 赋值为 1,这里控制台输出的 1 其实也是这个 a=1 表达式的返回值。

以笔记为镜,可以知得失