「前端开发」 -

JS-Operator

JavaScript —— 操作符

Posted by eliochiu on October 27, 2022

一元操作符

只操作一个值的操作符叫做一元操作符,常见的一元操作符有+、-、++、--等。

递增与递减操作符

递增(++)和递减(--)操作符功能与C语言相同,都是在原值的基础上实现自增和自减的效果。

按照赋值时机划分,递增/递减操作符可以分为分为前置递增/递减操作符和后置递增/递减操作符,他们主要的区别是:

  • 前置递增/递减操作符先对变量的值进行递增/递减,再返回该值。
  • 后置递增/递减操作符则恰好相反,即先返回该值,再对变量的值进行递增/递减。
1
2
3
4
var a = 20;
var ans1 = (++a)++;
console.log(ans1);  // 21
console.log(a);  // 22

递增与递减操作符不仅可以用于数字类型,还可以用于布尔、字符串等其他类型,应用时遵循如下规则:

  • 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量。
  • 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为 NaN。字符串变量变成数值变量。
  • 在应用于布尔值false时,先将其转换为0再执行加减1的操作。布尔值变量变成数值变量。
  • 在应用于布尔值true时,先将其转换为1再执行加减1的操作。布尔值变量变成数值变量。
  • 在应用于浮点数时,直接执行加减1操作。
  • 在应用于对象时,先调用对象的valueOf()方法,提供一个可用的值,在按照前面的规则执行;如果结果是NaN,那么再调用对象的toString()方法。对象变成数值变量。

一元加减操作符

一元加操作符

一元加操作符用+表示,放在值之前,对数值不会产生任何影响。但一元加操作符用在非数值类型的值之前,会对该类型进行转换,布尔会变成0或1,字符串会按照一定的规则进行解析,对象则会调用valueOf()或者toString()方法。

一元减运算符

一元减运算符主要用于表示负数,如果应用在数值类型上,则会将该值变为他的相反数;如果应用在非数值类型上, 将会进行类型转换,再取相反数。

布尔操作符

布尔操作符主要用于条件判断,在编程语言中具有相当重要的作用,主要包括逻辑与、逻辑或和逻辑非。

逻辑非

逻辑非由一个叹号(!)组成,可以用于任何类型,返回一个布尔值,遵循下面的规则:

  • 如果操作数是一个对象,返回false(除了null以外的所有对象都可以看成true,取反后自然会变成false
  • 如果操作数是空字符串,返回true
  • 如果操作数是非空字符串,返回false
  • 如果操作数是数值0,返回true
  • 如果操作数是任意非0数值,返回false
  • 如果操作数是null,返回true
  • 如果操作数是undefined,返回true
  • 如果操作数是NaN,返回true

逻辑与

逻辑与在这里不再赘述,根据真值表,只有当两个条件同时为真,结果才能为真。逻辑与可以应用于任何类型。但当有一个操作数不为布尔类型时,结果就不一定为布尔类型了。遵循如下规则:

  • 如果第一个操作数是对象,则返回第二个操作数;
  • 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象;
  • 如果两个操作数都是对象,返回第二个操作数;
  • 如果有一个操作数是null,返回null
  • 如果有一个操作数是undefined,返回undefined
  • 如果有一个操作数是NaN,返回NaN

逻辑与操作属于短路操作,只要第一个操作数能够决定结果,就不再会对第二个操作数求值,如果第一个数为false,则直接返回false,不会再考虑第二个数,哪怕第二个数未定义都不会引起错误。

逻辑或

逻辑或在这里不再赘述,根据真值表,只要两个条件其中之一为真,结果就为真。它遵循如下规则:

  • 如果第一个操作数是对象,则返回第一个操作数;
  • 如果第一个操作数是false,返回第二个操作数;
  • 如果两个操作数都是对象,返回第一个操作数;
  • 如果两个操作数都是null,返回null
  • 如果两个操作数都是undefined,返回undefined
  • 如果两个操作数都是NaN,返回NaN

逻辑或操作也属于短路操作,只要第一个操作数能够决定结果,就不再会对第二个操作数求值。如果第一个数为true,则直接返回true,不会再考虑第二个数,哪怕第二个数未定义都不会引起错误。

二元操作符

乘性操作符

乘法(*)、除法(/)、取模(%),这些操作符和C类似,在进行非数值型的运算时会使用Number()自动转换类型。

特别注意的是:0/0得到NaN,正数/0得到Infinity,负数/0得到-Infinity。

加性操作符

加法(+)、减法(-),他们的作用也和C类似,但是加法运算符还有一些区别。

如果加法两侧操作数为字符串,则进行字符串拼接操作;如果一个操作数是字符串,另一个操作数是数值,则将另一个操作数转换为字符串,返回拼接后的字符串。

关系操作符

小于(<)、大于(>)、大于等于(>=)、小于等于(<=),这几个关系操作符和C语言功能一样,均根据两个操作数的大小关系返回布尔值,这里不再赘述。

关系运算符也可以应用于任何类型,遵循下列规则:

  • 如果两个操作数都是数值,执行数值比较;
  • 如果两个操作数都是字符串,按照Unicode编码大小进行比较;
  • 如果一个操作数是数值,则将另一个操作数转换为数值再进行比较;
  • 如果一个操作数是对象,调用valueOf()toString()后按照前面规则比较;
  • 如果一个操作数是布尔值,将其转成数值再进行比较。
  • 如果一个操作数是NaN,无论如何都返回false,因为无法比较。

由于字符串比较的特殊性,我们通常比较字符串toLowerCase后的结果。

相等操作符

ES里相等比较符主要有:等值(==)、全等(===)、非等值(!=)、非全等(!==)四种。

等值与不等值

ES中不同类型的值也可以判断是否相等,使用==来判断两个值是否相等,使用!=来判断两个值是否不想等,比较遵循下列原则:

  • 如果有一个操作数是布尔值,若为true则转换成1,为false则转换成0。
  • 如果有一个操作数是字符串,比较前先将字符串转成数值。
  • 如果一个操作数是对象,则调用valueOf()方法转换成基本类型后再比较。
  • nullundefined是相等的。
  • 比较相等性时,不能将nullundefined转换成其他值。
  • 如果一个操作数是NaN,则相等操作符返回false;若两个操作数是NaN,同样返回false,任何NaN都不相等。
  • 如果两个操作数是对象,则判断两个操作数是否是同一引用。

下面是一些例子:

1
2
3
4
5
6
7
8
9
10
11
null == undefined // true
'NaN' == NaN // false
5 == NaN // false
NaN == NaN // false
NaN != NaN // true
false == 0 // true
true == 1 // true
true == 2 // false
undefined == 0 // false
null == 0 // false
"5" == 5 // true

全等和不全等

ES中三个等号===表示全等,全等不仅要求值相等,还要求两个值具有相同的类型:

1
2
5 == "5" // true
5 === "5" // false

三元操作符

三元操作符是指条件操作符,它的基本格式是这样的:condition ? true_statement : false_statement,如果条件为true则执行true_statement,否则执行false_statement