这篇文章结构性地列一下JS中的操作符,并结合示例代码加以简要说明。
- 一元操作符:只能操作一个值的操作符
- 递增
++
和递减--
:- 进行递增或递减操作(加1或减1)
- 分为前置型
++a
和后置型a++
,区别是前者先自增1再执行其他操作,后者先执行其他操作再自增1 -
++
和--
操作符适用于任何值,而不仅仅是数值类型。规则如下:- 应用于“可转为合法数值的字符串”:
- 应用于“可转为合法数值的字符串”:
var v = '3.14';
console.log(++v); //4.14
console.log(typeof v); //'number'(原字符串类型转为数值类型)
```
2. 应用于“不可转为合法数值型的字符串”:
```javascript
var v = 'hello 3.14';
console.log(++v); //NaN
console.log(typeof v); //'number'(转换为数值类型)
```
3. 应用于布尔值`true`或`false`时:
```
var v = true;
console.log(++v); //2(可知true按1计算,false按0计算)
console.log(typeof v); //'number'(布尔型转为数值型)
```
4. 应用于对象时:
先调用对象的`valueOf()`方法或`toString()`方法取到一个可操作的值,然后对该值应用上述规则。对象类型转为数值类型。
- 一元加
+
和一元减-
:- 表示正负
- 和递增递减一样,不局限于对数值的操作,规则也类似:
var str1 = '-3.14';
var str2 = 'hello 3.14';
var b = true;
var obj = {
valueOf: function(){
return -5;
}
};
console.log(+str1); //-3.14(转为Number类型)
console.log(+str2); //NaN(转为Number类型)
console.log(+b); //1(转为Number类型)
console.log(+obj); //-5(转为Number类型)
```
- 布尔操作符
- 逻辑非
!
:求反- 始终会返回一个布尔值
true
或false
- 可应用于任何值,规则如下:
- 始终会返回一个布尔值
var obj = {}; //任何对象(除了特殊的null)
var num = 3.14 //任何非0非NaN数值
var str = 'Hello World'; //任何非空字符串
//上边取非返回false,下边取非返回true
var emptyStr = '';
var n = null; //null
var u = undefined; //undefined
var zero = 0; //数值0
var notNum = NaN; //数值NaN
```
- 对某个值同时取非2次
!!
实际上和转型函数Boolean()的效果一样,会返回这个值得布尔型表示 - 逻辑与
&&
:“且”- 应用于两个两个操作数,只有在两个操作数都为真的情况下返回
true
- 属于短路操作符,即第一个操作数就能决定是否需要进一步判断第二个操作数,当第一个操作数为
false
时会直接返回false
而不再管第二个操作数 - 逻辑与
&&
的两个操作数不要求一定是布尔型,且&&
的返回结果也不一定是布尔值。特殊规则如下:- 如果第一个操作数是对象,则返回第二个操作数
- 如果两个操作数都是对象,则返回第二个操作数,即返回第二个对象
- 如果第二个操作数是对象,则只有在第一个操作数的结果为
true
的情况下才会返回该对象,否则返回false - 如果有一个操作数是
null
/undefined
/NaN
,则直接返回null
/undefined
/NaN
- 应用于两个两个操作数,只有在两个操作数都为真的情况下返回
- 逻辑或
||
:“或”- 应用于两个操作数,任一操作数为真时即返回
true
- 同样属于短路操作符,当第一个操作数为
true
时会直接返回true
而不再管第二个操作数 - 逻辑或
||
的两个操作数同样不要求一定是布尔型,规则如下:- 如果第一个操作数是对象,则返回第一个操作数
- 如果两个操作数都是对象,则返回第一个操作数
- 如果第一个操作数的结果为
false
,则返回第二个操作数 - 如果两个操作数都是
null
/undefined
/NaN
,则返回null
/undefined
/NaN
- 应用于两个操作数,任一操作数为真时即返回
-
乘性操作符:对于不是数值类型的操作数,后台会自动调用
Number()
转型函数先进行转型 - 乘法
*
:计算两个操作数的乘积 - 除法
/
:计算两个数的商 - 求模(求余)
%
:计算余数 - 加性操作符
- 加法
+
:- 如果两个操作数为数值,则执行常规的计算
- 如果有一个操作数为字符串,则将另一个操作数转为字符串后进行两个字符串的拼接:
var result = 5 + '5';
console.log(result); //55(变成了字符串相加)
```
- 减法
-
:- 注意一点和加法的差别:
- 注意一点和加法的差别:
var a = 3 + '3';
var b = 3 - '3';
console.log(a); //'33'(数值3被转型函数String()自动转为'3',计算的是'3'+'3')
console.log(typeof a); 'string'
console.log(b); //0(字符串'3'被转型函数Number()转为0,计算的是3-0)
console.log(typeof b); //'number'
```
- 关系操作符
-
>
<
>=
<=
- 始终返回一个布尔值
- 特殊比较时的规则如下:
- 比较两个字符串时,比较对应位置的字符编码值大小:
- 比较两个字符串时,比较对应位置的字符编码值大小:
console.log('Black' < 'alpha'); //true('B'的字符编码小于'a'的字符编码)
2. 如果有一个操作数是数值,则将另一个操作数转为数值,再进行比较:
javascript
console.log('314' > 3.14); //true('3.14'会在后台被转为314)
```
3. 如果有一个操作数是布尔值true
或false
,则将其转为数值1或0,再进行比较
4. 如果一个操作数是对象,则调用valueOf()
方法或toString()
方法取到可操作的值再按上面规则进行比较
- 相等操作符
- 相等和不相等(
==
!=
)- 在执行比较前,会进行强制转型,因此:
- 在执行比较前,会进行强制转型,因此:
console.log(false == 0); //true
console.log('5' == 5); //true
```
- 特别地:
console.log(null == undefined); //true
```
- 全等和不全等(
===``!==
)-
===
只在两个操作数未经类型转换就相等的情况下返回true
-
- 条件操作符
- 表达式
?
为真时返回这个:
为假时返回这个 - 赋值操作符
-
=
:把右侧的值赋值给左侧的变量- 前面加上某些操作符可实现复合赋值操作,如:
+=
-=
*=
/=
等等
- 前面加上某些操作符可实现复合赋值操作,如:
- 位操作符:不常用,这里不做介绍了