一、一元操作符(unary)
1. 递增/递减操作符
分类
:
- 前缀版递增/递减操作符 ++age、–age
- 后缀版递增递减操作符 age++、age–
区别
:
- 后缀版递增与递减在语句被求值后才发生。正常情况下前缀版和后缀版并无差异,可是一旦与其它操作混合时,差异就会变明显。
- 前缀版在与其它操作混合时,
先对变量进行递增/递减操作,再完成混合操作
(见实例2)- 后缀版,
先完成混合操作,再递增/递减
(见实例3)
let age = 29;
++age;
// 等价于
let age = 29;
age = age + 1;
let age = 29;
let anotherAge = --age + 2
console.log(age) // 28
console.log(anotherAge) // 30
let age = 29;
let anotherAge = age-- + 2
console.log(age) // 28
console.log(anotherAge) // 31
let age = "29";
console.log(age++) // 29
console.log(age) // 30
console.log(age--) // 30
console.log(++age) // 30
前缀、后缀的递增、递减这4个一元操作符可以作用于任何值——字符串、布尔值、浮点数、甚至对象,其规则如下:
字符串
。如果是有效的数值形式,则转换为数值再应用改变,变量类型从字符串变成数值;如果不是有效的数值形式,则将变量的值设置为NaN,变量类型从字符串变成数值。布尔值
。如果是false,则转换为0再应用改变,如果是true,则转换为1再应用改变。变量类型从布尔值变成数值。浮点数
。加1或减1。对象
。如果是对象,则调用其valueOf()方法取得可以操作的值。对得到的值应用上述规则。如果是NaN,则调用toString()并再次应用其他规则。变量类型从对象变成数值。
let s1 = "2";
let s2 = "z";
let b = false;
let f = 1.1;
let o = {
valueOf() {
return -1
}
};
console.log(s1++) // 2
console.log(s2++) // NaN
console.log(b++) // 0
console.log(f--) // 1.1
console.log(o--) // -1
console.log(s1) // 3
console.log(s2) // NaN
console.log(b) // 1
console.log(f) // 0.10000000000000009
console.log(o) //-2
2.一元加、减
- 放在变量前头,对数值没有任何影响
- 一元加应用到非数值,则会执行与使用Number()转型函数一样的类型转换:
- 布尔值false和true转换为0和1;
- 字符串根据特殊规则进行解析;
- 对象会调用它们的valueOf()和/或toString()方法以得到可以转换的值。
let s1 = "01";
let s2 = "1.1";
let s3 = "z"
let b = false;
let f = 1.1;
let o = {
valueOf() {
return -1
}
};
s1 = +s1;
s2 = +s2;
s3 = +s3;
b = +b;
f = +f;
o = +o;
console.log(s1) // 1
console.log(s2) // 1.1
console.log(s3) // NaN
console.log(b) // 0
console.log(f) // 1.1
console.log(o) //-1