布尔操作符
它在编程语言中的作用非常重要,不然if...else...之类的语句就不会有用武之地了,它主要包含三个操作:非(NOT)、与(AND)和或(OR)
逻辑非
逻辑非用一个!表示,它会把操作数转换成一个布尔值,然后取反,转换规则和Boolean函数转换一致,不在赘述。
console.log(!'') // true
console.log(!123) // false
逻辑与
逻辑与由两个和号(&&)表示, 它有两个操作数,逻辑与可以应用于任何类型的操作数,在一个数不是布尔的情况下,逻辑与操作就不一定但会布尔值了。
根据我自己的总结,如果第一个操作数可以转换成true,那么就返回第二个操作数;如果第一个操作数可以转换成false,那么就返回第一个操作数。需要注意,不管返回的是第一个还是第二个操作数,返回的始终是操作数本身。
逻辑与操作属于短路操作, 上面的我总结出的经验也说明了这一点,下面的例子可以证明这一点:
var foo = false
var result = foo && a;
console.log(result) // false, 这里我并没有定义a变量,但是js没有报错,说明没有执行到a。
// 将foo改成true将会报错。
逻辑或
逻辑或由连个竖线(||)表示,也有两个操作数,也是短路操作。
它的逻辑和逻辑与相似,如果第一个操作数可以转换成true,那么返回第一个操作数,否则返回第二个。因为这一特性,所以逻辑或经常用来给变量初始化赋值。
var foo = prefreValue || defaultValue
// 如果第一个值不是null,那么就会返回prefreValue,否则返回defaultValue,相当于做了个fallbak。
乘性操作符
ES定义了三个乘性操作符:乘法、触发、取模。大部分情况下与其他语言的相应操作符类似,只不过在遇到非数值时会自动执行类型转换。转换规则与使用Number函数一致。
乘法
乘法用一个星号表示(*),规则如下:
- 如果有一个操作数不是数值,那么会调用Number函数转换成数值,然后应用以下规则。
- 如果都是数值,就是正常的计算,如果超出范围,那么会显示Infinity或者-Infinity。
- 如果有一个是NaN,那么返回NaN。
- Infinity * 0返回NaN。
- Infinity * 123(非0值) 返回Infinity或者-Infinity。
- Infinity * Infinity 返回Infinity。
除法
与乘法操作符类似,规则如下:
- 如果有一个操作数不是数值,那么会调用Number函数转换成数值,然后应用以下规则。
- 如果都是数值,就是正常的计算,如果超出范围,那么会显示Infinity或者-Infinity。
- 如果有一个是NaN,那么返回NaN。
- Infinity / Infinity返回Infinity。
- 0 / 0 返回 NaN。
- 123(非0值) / 0 返回Infinity或者-Infinity。
- Infinity / 123(非0值)返回Infinity或者-Infinity。
求模
也就是求余数,用%表示,规则如下:
- 如果有一个操作数不是数值,那么会调用Number函数转换成数值,然后应用以下规则。
- 如果都是数值,就是正常的计算。
- Infinity % 124、5 % 0和Infinity % Infinity 这三种情况都返回NaN。
- 5 % Infinity返回5,也就是有限数与无穷数取模,返回自身。
- 0 % 123 (非0值)返回 0。
加性操作符
加法
用+表示,规则如下:
- Infinity + Infinity等于 Infinity 。
- -Infinity + -Infinity 等于 -Infinity。
- Infinity + -Infinity 等于 NaN。
- 如果其中有一个值不是数值,是其他类型,那么根据该类型转换成字符串的规则转换,转换后按照字符串拼接。
- NaN 参与运算返回NaN。
减法
用-表示,规则如下:
- Infinity - Infinity和-Infinity - -Infinity都等于 NaN 。
- Infinity - -Infinity等于 Infinity 。
- -Infinity - Infinity 等于 -Infinity。
- 如果其中有一个值不是数值,是其他类型,那么根据该类型转换成字符串的规则转换,转换后按照字符串拼接。
- NaN 参与运算返回NaN。
关系操作符
小于(<)、大于(>)、小于等于(<=)、和大于等于(>=),规则如下:
- 都是数值直接比较。
- 都是字符串,比较字符编码。
- 一个是数值,则把另一个值转换成数值,然后比较。
**字符串编码中大写字母的编码全部小于小写字母,**所以
'Bfff' < 'afsdaf' // true
字符串和数字比较,都会被转化成数字。如果字符串转化出来是NaN,那么结果都是false
'23' < 2 // false
'c' > 5 // false
'c' < 5 // false
相等操作符
相等和不相等
相等(==)和不相等(!=),先转换在比较,规则如下
- 字符串和数字或者布尔值和数值,都会转化为数值然后比较大小。
- 如果是对象调用valueof()方法,然后根据上一条规则转化。
- null等于undefined。
- 只要有NaN,相等判断返回false,不相等返回true。(NaN != NaN)。
- 如果都是对象,那么判断是不是同一个对象。是返回true,否返回false。
全等和不全等
全等(===)和不全等(!==)不会进行类型转化,直接比较是否相等。
'55' == 55 // true
'55' === 55 // false
由于类型转化的不确定性,我们应该不是用相等和不相等,只使用全等和不全等。
条件操作符
也就是常说的三元表达式。它会根据问好前面的表达式返回的结果如果是true,那么返回问号后面的结果,如果是false,那么返回冒号后面的结果。如果问号前面的表达式返回的不是布尔值,会转换成布尔值,转换规则和Boolean()一致。
var max = a > b ? a : b;
赋值操作符
这应该是最简单的操作符了,就是把右边的值赋给左边的变量。还有一些简写的复合操作符,可以简化写法。
a = a * b // 等价于 a *= b
剩余的一些还有/=、%=、+=、-=等等一些操作。它们都只能简化写法,并不能提升性能。