【重走JavaScript之高级程序设计】 操作符
一、一元操作符
只操作一个值的操作符叫一元操作符
递增递减操作符
-
前缀递增递减符号
++a; --a;
,变量a的值会在语句求值前被改变,具有副作用 -
后缀递增递减符号
a++; a--;
,变量a的值会在语句求值后被改变,不会改变语句执行的结果。
对于递增递减操作符,与其他数据类型使用
- 数值字符串转变为数值再计算,非数值字符串转变为NaN再计算
- 布尔值false变为0再计算,布尔值true变为1再计算
- 浮点数加1或减1
let s1 = "2", s2 = "z", b = false, f = 1.1;
let o = {
valueOf() {
return -1
}
};
s1++; // 值变成数值3
s2++; // 值变成NaN
b++; // 值变成数值1
f--; // 值变成0.1000...09(浮点数不精确)
o--; // 值变成-2
二、一元+或-
一元+或-用法同数学。
单独使用一元+或-应用到非数值,执行Number()类型转换。布尔值转为0或1,字符串根据规则解析,对象调用valueOf或toString,+和-同理。
let s1 = "01", s2 = "1.1", s3 = "z", b = false, f = 1.1;
let o = {
valueOf() {
return -1
}
};
s1 = +s1; // 值变成数值1
s2 = +s2; // 值变成1.1
s3 = +s3; // 值变成NaN
b = +b; // 值变成数值0
f = +f; // 值仍是1.1
o = +o; // 值变成-1
三、位操作符
?
四、布尔操作符
- 逻辑非 !
- 逻辑与 && 全真为真,一假则假。注意逻辑短路
- 逻辑或 || 全假为假,一真则真。注意逻辑短路
五、乘性操作符
- *乘
- /除
- %取余
六、加性操作符
加法操作符+如下,减法操作符同理
- 数值直接相加
- 两个字符串直接拼接,一个字符串一个数值先将数值转换为字符串再拼接。
- 有NaN则返回Nan
Infinity + Infinity = Infinty; -Infinity + -Infinity = -Infinty; Infinity + -Infinity = NaN;
+0 + +0 = +0; -0 + +0 = +0; -0 + -0 = -0;
- undefined null 则调用String(),返回"undefined"和"null"
七、关系操作符
< > <= >=同数学规则,结果返回布尔值
- 两个相同类型字符串比较,按照字符编码。
- 一个字符串一个数值,则将字符串转化为数值再比较。
- 只要有NaN,则返回false。
八、 相等操作符
等于和不等于 == 和!=
- 先强制转化类型再比较
null == undefined // true
,且null和undefined不能转化为其他类型进行比较- 有NaN则返回false
全等和不全等 === 和!==
- 不会转化类型直接比较
- !==代表在不转化的前提下不想等返回true
null === undefined // false
,数据类型不同- 推荐使用全等和不全等操作符,以免遇到类型转化问题
九、条件操作符
三元表达式,三元表达式可以嵌套但是缺乏可读性
a = 表达式 ? 真走这 : 假走这
十、赋值操作符
let num =10,将右手的值赋给左手
+= 或 *=这类复合赋值仅仅是简写语法,不会提升任何性能
十一、逗号操作符
let num1 = 1, num2 = 2, num3 = 3
洗尽铅华始见金,褪去浮华归本真