JS操作符(下)

156 阅读5分钟

布尔操作符

它在编程语言中的作用非常重要,不然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函数一致。

乘法

乘法用一个星号表示(*),规则如下:

  1. 如果有一个操作数不是数值,那么会调用Number函数转换成数值,然后应用以下规则。
  2. 如果都是数值,就是正常的计算,如果超出范围,那么会显示Infinity或者-Infinity。
  3. 如果有一个是NaN,那么返回NaN。
  4. Infinity * 0返回NaN。
  5. Infinity * 123(非0值) 返回Infinity或者-Infinity。
  6. Infinity * Infinity 返回Infinity。

除法

与乘法操作符类似,规则如下:

  1. 如果有一个操作数不是数值,那么会调用Number函数转换成数值,然后应用以下规则。
  2. 如果都是数值,就是正常的计算,如果超出范围,那么会显示Infinity或者-Infinity。
  3. 如果有一个是NaN,那么返回NaN。
  4. Infinity / Infinity返回Infinity。
  5. 0 / 0 返回 NaN。
  6. 123(非0值) / 0 返回Infinity或者-Infinity。
  7. Infinity / 123(非0值)返回Infinity或者-Infinity。

求模

也就是求余数,用%表示,规则如下:

  1. 如果有一个操作数不是数值,那么会调用Number函数转换成数值,然后应用以下规则。
  2. 如果都是数值,就是正常的计算。
  3. Infinity % 124、5 % 0和Infinity % Infinity 这三种情况都返回NaN。
  4. 5 % Infinity返回5,也就是有限数与无穷数取模,返回自身。
  5. 0 % 123 (非0值)返回 0。

加性操作符

加法

用+表示,规则如下:

  1. Infinity + Infinity等于 Infinity 。
  2. -Infinity + -Infinity 等于 -Infinity。
  3. Infinity + -Infinity 等于 NaN。
  4. 如果其中有一个值不是数值,是其他类型,那么根据该类型转换成字符串的规则转换,转换后按照字符串拼接。
  5. NaN 参与运算返回NaN。

减法

用-表示,规则如下:

  1. Infinity - Infinity和-Infinity - -Infinity都等于 NaN 。
  2. Infinity -  -Infinity等于 Infinity 。
  3. -Infinity -  Infinity 等于 -Infinity。
  4. 如果其中有一个值不是数值,是其他类型,那么根据该类型转换成字符串的规则转换,转换后按照字符串拼接。
  5. NaN 参与运算返回NaN。

关系操作符

小于(<)、大于(>)、小于等于(<=)、和大于等于(>=),规则如下:

  1. 都是数值直接比较。
  2. 都是字符串,比较字符编码。
  3. 一个是数值,则把另一个值转换成数值,然后比较。

**字符串编码中大写字母的编码全部小于小写字母,**所以

'Bfff' < 'afsdaf' // true

字符串和数字比较,都会被转化成数字。如果字符串转化出来是NaN,那么结果都是false

'23' < 2 // false
'c' > 5 // false
'c' < 5 // false

相等操作符

相等和不相等

相等(==)和不相等(!=),先转换在比较,规则如下

  1. 字符串和数字或者布尔值和数值,都会转化为数值然后比较大小。
  2. 如果是对象调用valueof()方法,然后根据上一条规则转化。
  3. null等于undefined。
  4. 只要有NaN,相等判断返回false,不相等返回true。(NaN != NaN)。
  5. 如果都是对象,那么判断是不是同一个对象。是返回true,否返回false。

全等和不全等

全等(===)和不全等(!==)不会进行类型转化,直接比较是否相等。

 '55' == 55 // true
 '55' === 55 // false

由于类型转化的不确定性,我们应该不是用相等和不相等,只使用全等和不全等。

条件操作符

也就是常说的三元表达式。它会根据问好前面的表达式返回的结果如果是true,那么返回问号后面的结果,如果是false,那么返回冒号后面的结果。如果问号前面的表达式返回的不是布尔值,会转换成布尔值,转换规则和Boolean()一致。

var max = a > b ? a : b;

赋值操作符

这应该是最简单的操作符了,就是把右边的值赋给左边的变量。还有一些简写的复合操作符,可以简化写法。

 a = a * b // 等价于 a *= b

剩余的一些还有/=、%=、+=、-=等等一些操作。它们都只能简化写法,并不能提升性能。