学习操作符这个章节最好回忆一下C里的惯例,因为ECMAScript的标准很多继承自C的语法
只能操作一个值得操作符
递增和递减操作符
var age = 29;
++age; //30
var age = 29;
age = age +1; //30
var age = 29;
--age; //28
var age = 29 ;
var anotherAge = –-age +2;
alert (age); //28
alert(anotherAge); //30
var age = 29;
age++; // 先求值再增加1
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; //等于22
var num4 = num1 + num2; //等于21
以上四个操作符对任何值都适用,也就是他们不仅适用于整数,还可以用于字符串, 布尔值, 浮点数值和对象。 在应用于不同的值时,递增和递减操作符遵循下列规则、
以下示例展示了上面的规则:
var s1 = “2”;
var s2 = “z”;
var b = false;
var f = 1.1;
var o = {
valueOf: function() {return –1;}
};
s1++; //3
s2++; //NaN
b++; //1
f- - ; //值变成0.10000000000000009(由于浮点舍入错误所致)
o- -; // –2
一元加和减操作符
在对非数值应用一元加操作符时,该操作符会像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; //值变成数值-1
一元减操作符和一元加操作符的用法类同,不再啰嗦。
一共有三个: 非(NOT), 与(AND), 和或(OR)。
逻辑非
逻辑非用一个感叹号(!)表示, 可用于ECMAScript中的任何值, 无论这个值是什么数据类型, 这个操作符都会返回一个布尔值。 首先将它的操作数转换为一个布尔值, 然后再对其求反。也就是说,逻辑非遵循下列规则:
下面的示例展示上述规则的结果
alert(!false); //true
alert(!”blue”); //false
alert(!0); //true
alert(!NaN); //true
alert(!””); //true
alert(!12345); //false
逻辑与
&&操作可以应用于任何类型的操作数,而不仅仅是布尔值。 在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值, 此时,他遵循下列规则;
逻辑与属于短路操作,如果第一个操作数为false, 无论第二个操作数是什么值,结果都不再可能是true了。
再看下面的例子;
var found = true;
var result = (found && someUndefinedVariable); //这里会发生错误,
alert(result); //这一行不会执行,
因为变量someUndefinedVariable没有声明。 由于变量found的值是true, 所以逻辑与操作符会继续对变量someUndefinedVariable求值。 但是someUndefinedVariable尚未定义,因此会导致错误。
逻辑或
逻辑或操作符由两个竖线符号(||)表示, 有两个操作数。
和逻辑操作相似,如果有一个操作数不是布尔值, 逻辑或也不一定返回布尔值; 此时,他遵循下列规则:
与逻辑与操作符相似,逻辑或操作符也是短路操作符。也就是说, 如果第一个操作数的求值结果为true, 就不会对第二个操作数求值。
可以利用逻辑或的这个 行为来避免为变量赋null或undefined值。 例如;
var myObject = preferredObject || backupObject;
在这个例子中,变量myObject将被赋予等号后面两个值中的一个。 变量preferredObject中包含优先赋给变量myObject的值, 变量backupObject负责在preferredObject中不包含有效值的情况下提供后备值。如果preferredObject的值不是null, 那么它的值将被赋给myObject, 如果是null, 则将backupObject的值赋给myObject。 ECMAScript程序的赋值语句经常会用这种模式。
在处理特殊值的情况下,乘法操作符遵循下列特殊的规则:
和乘法操作符类似,除法操作符对特殊的值也有特殊的处理规则, 这些规则如下:
求模(余数)操作符由一个百分号(%)来表示,遵循下面的规则;
如果两个操作符都是数值, 执行常规的加法计算, 然后根据下列规则返回结果:
如果有一个操作数是字符串, 那么就要应用如下规则:
如果有一个操作数是对象,数值,或布尔值, 则调用他们的toString()方法取得相应的字符串值, 然后再应用前面关于字符串的规则,对于undefined和null,则分别调用String()函数并取得字符串“undefined”和“null”。
值得注意的示例:
var num1 = 5;
var num2 = 10;
var message = “The sum of 5 and 10 is “ + num1 + num2 ;
alert(message) ; // “The sum of 5 and 10 is 510” 字符串操作的结果,若想对数值执行算术计算, 然后再将结果和字符串拼接起来,应该像下面这样使用圆括号:
var num1 = 5;
var num2 = 10;
var message = “The sum of 5 and 10 is “+(num1 + num2);
alert(message); // ”The sum of 5 and 10 is 15”
与加法操作符类似, ECMAScript中的减法操作符在处理各种数据类型的转换时,同样需要遵守一些特殊的规则, 如下所示:
下面的例子展示了上面的规则
var result1 = 5 – true ; //4, 因为true被转换成1
var result2 = NaN –1; //NaN
var result3 = 5 –3; //2
var result4 = 5 – “”; //5, 因为“”被转换成了0
var result5 = 5 – “2”; //3, 因为“2” 被转换成了2
var result6 = 5 – null; //5, 因为null被转换成了0
与ECMAScript中的其他操作符一样,当关系操作符的操作数使用了非数值时,也要进行数据转换或完成某些奇怪的操作,以下就是相应的规则:
请仔细体会以下示例:
var result = “Brick” <”alphabet”; //true 因为大写字符的编码都比小写字符编码小
var result = “Brick”.toLowerCase() < “alphabet”.toLowerCase(); //false 都转换成小写字母后就可得到想要的结果。
var result = “23” <”3”; //true
var result = “23” < 3 ; //false, “23”会转换成数值23然后再与3进行比较,因此就会得到合理的结果。
var result = result = “a” <3 ; //false, 因为”a”被转换成了NaN
var result = NaN < 3; //false
var result = NaN >= 3; //false 这个没有什么道理可说,和NaN进行比较就返回false。
1)相等和不相等
ECMAScript中的相等操作符由两个等于号(==)表示,如果两个操作数相等,则返回true。 而不相等操作符由叹号后跟等于号(!=)表示, 如果两个操作数不相等, 则返回true。 这两个操作符都会先转换操作数(通常称为强制转换), 然后再比较他们的相等性。
在转换不同的数据类型时,相等和不相等操作遵循下列基本规则:
这个两个操作数在进行比较时要遵循下列规则。
2)全等和不全等
除了在比较之前不转换操作数之外, 全等和不全等操作符与相等和不相等操作符没有什么区别。 全等操作符由3个等于号(===)表示, 它只在两个操作数未经转换就相等的情况下返回true,如下面例子;
var result1 = (“55” == 55); //true ,因为转换后相等
var result2 = (“55” ===55); //false, 因为不同的数据类型不相等
var result3 = (“55” != 55); //false, 因为转换后相等
var result4 = (“55”!== 55); //true, 因为不同的数据类型不相等
由于相等和不相等操作符存在类型转换问题,而为了保持代码中数据类型的完整性。 我们推荐使用全等和不全等操作符。
Javascript操作符的内容到此为止