第三章:JavaScript基本概念
操作符
一元操作符:
递增和递减操作符(++ –)
注意:执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。
例如:
var age = 29;
var anotherAge = --age + 2;
alert(age); // 输出28
alert(anotherAge); // 输出30
注意:把递增操作符放在变量后面并不会改变语句的结果,因为递增是这条语句的唯一操作。但是,当语
句中还包含其他操作时,上述区别就会非常明显了。
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; // 等于22
var num4 = num1 + num2; // 等于21
++ 和 –操作遵循以下规则:
字符串和布尔值:先转换为数字再进行操作,
对象:先调用对象的valueOf()方法,然后对该值进行运算。如果结果是NaN,则在调用toString()方法后再应用运算。对象变量变成数值变量。
var o = {
valueOf: function() {
return -1;
}
};
o = +o; // 值变成数值-1
位操作符:
按位非、于、或、异或:
先将数值转化为二进制数,再进行位操作:
例如:25 | 3:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
--------------------------------------------
OR = 0000 0000 0000 0000 0000 0000 0001 1011
结果为27。
左移操作符由两个小于号(<<)表示,这个操作符会将数值的所有位向左移动指定的位数
布尔操作符:
1、逻辑非:(!)
if(!false){
//do something
}
2、逻辑与:
遵循规则:
- 如果第一个操作数是对象,则返回第二个操作数:
var o = new Object()
alert(o && true); ==>true
- 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true 的情况下才会返回该对象,因为false&&任何值都是false;
var o = new Object()
alert(Boolean(true && o)); ==>true
- 如果两个操作数都是对象,则返回第二个操作数;
- 如果有一个操作数是null,NaN或者undefined,则返回null,NaN或者undefined。
3、逻辑或:
规则:
- 如果第一个操作数是对象,则返回第一个操作数。
- 如果第一个操作数的求值结果为false,则返回第二个操作数。
- 如果两个操作数都是对象,则返回第一个操作数。
- 如果有一个操作数是null,NaN或者undefined,则返回null,NaN或者undefined。
运算符:
乘法:(*),除法:(/),求余:(%)
如果参与计算的某个操作数不是数值,后台会先使用Number()转型函数将其转换为数值。
加法:(+)
- 如果有一个操作数是字符串,则将另一个操作数转换为字符串,然后将两个字符串拼接起来。
- 如果两个都是数字,则执行数学相加。
- 如果有一个操作数是对象、数值或布尔值,则调用它们的toString()方法取得相应的字符串值,然后再应用前面关于字符串的规则。对于undefined和null,则分别调用String()函数并取得字符串”undefined”和”null”。
减法:(-)
- 如果有一个操作数是字符串、布尔值、null 或undefined,则先在后台调用Number()函数将其转换为数值,然后再根据前面的规则执行减法计算。如果转换的结果是NaN,则减法的结果就是NaN;
- 如果有一个操作数是对象,则调用对象的valueOf()方法以取得表示该对象的数值。如果得到的值是NaN,则减法的结果就是NaN。如果对象没有valueOf()方法,则调用其toString()方法并将得到的字符串转换为数值。
关系运算符
“>,<,>=,<=”等运算符都返回一个布尔值,遵循以下规则:
- 如果两个操作数都是数值,则执行数值比较。
- 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
'23'<'3' ==> true
//"2"的字符编码是50,而"3"的字符编码是51
- 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
- 如果一个操作数是对象,则调用这个对象的valueOf()方法,用得到的结果按照前面的规则执行比较。如果对象没有valueOf()方法,则调用toString()方法,并用得到的结果根据前面的规则执行比较。
- 如果一个操作符是布尔值,则转化为数值比较
相等操作符
ECMAScript 的解决方案就是提供两组操作符:相等和不相等——先转换再比较,全等和不全等——仅比较而不转换。
转换规则:
- 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
- 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false 转换为0,而 true 转换为1;
- 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较;
- null和undefined在使用相等操作符比较时会返回true
- NaN与任何值做相等判断都会返回false,即便NaN自身也是。
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true;否则,返回false。
全等和不全等操作符(===和!==)不会对比较的操作数进行类型转换,因此他们比较的是在两个操作数未经转换时是否相等。
条件操作符:
variable = boolean_expression ? true_value : false_value;
例如:
3 > 5 ? true:false ==>false