一元操作符,即只能操作一个值的操作符,是JS中最简单的操作符。
1.递增和递减操作符
分为2个版本:前置型和后置型。若使用前置递增操作符给一个数值加1,要把(++)放在数值前面:
var a = 1;++a; ==> var a = 1;a = a+1;
递减操作与递增操作类似,即把(--)放在数值前面。
后置型的话,与前置型语法一样,只是把(++/--)放在数值后面,但是,它与前置性有一个很大的区别,在于后置型的操作,是在包含它的语句执行完了之后才执行;而前置型的操作是在语句被求值之前改变。这样说肯定是很那么懂,看完下面的例子就懂了:
前置型:var a = 20;
var b = 20;
var c = ++ a + b;
alert(a); ==》21
alert(b); ==》41
这个看起来没什么问题,输出a为(a+1),c为(a+1+b);
后置型:var a = 20;
var b = 20;
var c = a++ + b;
alert(a); ==>21;
alert(c); ==>40;
这里问题就出现了,为什么c是40而不是41呢?这里我们再来看一下上面这句话后置型的操作,是在包含它的语句执行完了之后才执行;我们输出了c,对于后置型来说,因为在a++后面还有操作,所以就先执行a+b,将结果赋值给c,然后再执行a++,所以a的结果是加过后的结果,c的结果是没有加之前的操作。
2.应用于不同的值
上面的四种操作符对所有的值都适用,也就是它们不仅适用于整数,还可以用于字符串、布尔值、浮点数值和对象 。但它们都遵从下面的规则:
1: 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减 1 的操作。 var s1 = "3";s1++; ==>4
2: 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为 NaN 。var s2 = "aaa";s2++; ==>NaN
3: 在应用于布尔值 时,若果是true,就将转换成1,在执行操作;如果是false,就将转换成0。var b1 = true;b1++; ==>2
4: 在应用于浮点数值(小数)时,执行加减 1 的操作。var n1 = 3.1;n1++; ==>4.1
5: 在应用于对象时,先调用对象的 valueOf()方法,以取得一个可供操作的值,在根据上面的规则进行操作;
var o = {
valueOf: function() {
return -10;
}
};
o++; ==>-9
3.一元加和减(+/-)操作赋
这两个操作符对于数值的操作和数学上并没有区别,只是在对于非数值的操作中不同。
在一元加操作符中,对非数值的操作,该操作符会像 Number()转型函数一样对这个值执行转换 布尔值 false 和 true 将被转换为 0 和 1,
字符串值会被按照一组特殊的规则进行解析,而对象是先调用它们的 valueOf()或 toString()方法,再转换得到的值 。
var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
}
};
s1 = +s1; // 值变成数值 1
s2 = +s2; // 值变成数值 1.1
s3 = +s3; // 值变成 NaN
b = +b; // 值变成数值 0
f = +f; // 值未变,仍然是 1.1
o = +o; // 值变成数值-
一元减操作符主要是表示负数,而当应用于非数值时,一元减操作符遵循与一元加操作符相同的规则,最后再将得到的数值转换为负数 。
var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
}
};
s1 = -s1; // 值变成了数值-1
s2 = -s2; // 值变成了数值-1.1
s3 = -s3; // 值变成了 NaN
b = -b; // 值变成了数值 0
f = -f; // 变成了-1.1
o = -o; // 值变成了数值 1