3.5.1 一元操作符
1.递增(++)和递减(--)操作符
前置递增递减与后置递增递减最重要的区别:后置递增递减操作是在包含他们的语句被求值后才执行的。
a:前置递增和递减
语法:递增递减操作符位于要操作的变量之前,如 ++num ;
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2; //等于21
var num4 = num1 + num2; //等于21
//from page 37
b:后置递增和递减
语法:递增递减操作符位于要操作的变量之后,如 num-- ;
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; //等于22 这句先用原来的num1+num2得到值22后,才执行的num1--
var num4 = num1 + num2; //等于21 此时num1已经递减,值为1,所以得到21的值
//from page 37
递增递减操作符对任何值都适用,遵循以下原则:
①:应用于一个包含有效数字的字符串时,先转换为数字值,再执行递增递减
②:应用为不包含有效数字的字符串时,将变量值转换为NaN
③:应用为布尔值时,转换为0或1,再递增递减
④:应用浮点数值时,执行递增递减
⑤:应用于对象时,先调用valueOf()方法,再应用前述规则
2 一元加和减操作符
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
//一元减操作符
s1 = -s1; //值变成数值-1
s2 = -s2; //值变成数值-1.1
s3 = -s3; //值变成NaN
b = -b; //值变成数值0
f = -f; //值变成了-1.1
o = -o; //值变成数值1
//from page 38-39
3.5.2 位操作符
看不懂,以后补
3.5.3 布尔操作符
逻辑非,逻辑与,逻辑或
1.逻辑非(NOT)
用(!)表示,适用于任何值,返回布尔值,然后再求其反。
操作规则:
返回true的有:空字符串,数值0,null,NaN,undefined;
返回false的有:对象,非空字符串,任意非0数值(包括Infinity)
alert(!false); //true
alert(!"blue"); //false
alert(!0); //true
alert(!NaN); //true
alert(!""); //true
alert(!12345); //false
//from page 44
2.逻辑与(AND)
用(&&)表示,有两个操作数,如下;
var result = true && false;
逻辑与的真值表
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
遵循规则如下
① 如果第一个操作数是对象,则返回第二个操作数;
② 如果第二个操作数是对象,则只有在第一个操作数求值结果为true的情况下才返回该对象;
③ 如果两个操作数都是对象,则返回第二个操作数;
④ 如果第一个操作数是null,则返回null;
⑤ 如果第一个操作数是NaN,则返回NaN;
⑥ 如果第一个操作数是undefined,则返回undefined;
逻辑与是短路操作,当第一个操作数是false时,结果肯定是false,所以不会执行第二个操作数了,如下:
var found = false;
var result = (found && someUndefinedVariable);
//尽管第二个操作数未声明应该发生错误但不会发生错误,因为found是false,短路操作了
alert(result); //会执行,弹出false
//from page 45
2.逻辑或(OR)
用(||)表示,有两个操作数,如下;
var result = true || false;
逻辑或的真值表
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
遵循规则如下
① 如果第一个操作数是对象,则返回第一个操作数;
② 如果第一个操作数的求值结果是false,则返回第二个操作数;
③ 如果两个操作数都是对象,则返回第一个操作数;
④ 如果两个操作数都是null,则返回null;
⑤ 如果两个操作数都是NaN,则返回NaN;
⑥ 如果两个操作数都是undefined,则返回undefined;
逻辑或 也是短路操作,当第一个操作数是true时,结果肯定是true,所以不会执行第二个操作数了,如下:
var found = true;
var result = (found || someUndefinedVariable);
//尽管第二个操作数未声明应该发生错误但不会发生错误,因为found是true,短路操作了
alert(result); //会执行,弹出true
//from page 46
我们可以利用逻辑或的这一形我来为变量赋null或undefined,如下:
var myObject = preferredObject || backupObject;
//preferredObject有值时优先赋给变量,没有值时backupObject再赋给变量;
3.5.4 乘性操作符
1.乘法
用(*)表示,计算两个值的乘积;
var result = 34 * 56;
遵循规则:
① 如果操作数都是数值,则执行常规乘法计算;
② 如果有一个操作数是NaN,结果则是NaN;
③ 如果是Infinity与0相乘,则结果是NaN;
④ 如果是Infinity与非0数值相乘,则结果是Infinity或-Infinity,取决于有符号操作数的符号;
⑤ 如果是Infinity与Infinity相乘,则结果是Infinity;
⑥ 如果一个操作数不是数值,则后台调用Number()将其转换成数值,再应用上面的规则;
2.除法
用(/)表示,
var result = 66 / 11;
① 如果操作数都是数值,则执行常规除法计算;
② 如果有一个操作数是NaN,结果则是NaN;
③ 如果是Infinity被Infinity除,则结果是NaN;
④ 如果是0被0除,则结果是NaN;
⑤ 如果是非0的有限数被0除,则结果是Infinity或-Infinity,取决于有符号操作数的符号;
⑥ 如果是Infinity被任何非0数值除,则结果是Infinity或-Infinity,取决于有符号操作数的符号;
⑦ 如果一个操作数不是数值,则后台调用Number()将其转换成数值,再应用上面的规则;
3.求模
求模(余数)操作符由(%)表示;
var result = 26 % 5; //等于1
① 如果操作数都是数值,则执行常规除法计算,返回余数;
② 如果被除数是无穷大值而除数是有限大的数值,则结果是NaN;
③ 如果被除数是有限大的数值而除数是0,则结果是NaN;
④ 如果是Infinity被Infinity除,则结果是NaN;
⑤ 如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;
⑥ 如果是Infinity被任何非0数值除,则结果是Infinity或-Infinity,取决于有符号操作数的符号; 如果是0被0除,则结果是0;
⑦ 如果一个操作数不是数值,则后台调用Number()将其转换成数值,再应用上面的规则;
3.5.5 加性操作
1.加法
用(+)表示;
规则:
如果两个都是数值:
① 如果有一个操作数是NaN,则结果是NaN;
② 如果是Infinity加Infinity,则结果是Infinity;
③ 如果是-Infinity加-Infinity,则结果是-Infinity;
④ 如果是Infinity加-Infinity,则结果是NaN;
⑤ 如果+0加+0,则结果是+0;
⑥ 如果-0加-0,则结果是-0;
⑦ 如果是+0加-0,则结果是+0。
如果有操作数有字符串:
① 如果两个都是字符串,则将两个字符串拼接起来;
② 如果只有一个是字符串,则将另一个操作数转换成字符串再拼接起来
如果是对象、数值、布尔值,则调用toString()方法取得相应的字符串值再应用上面规则;
如果是null和undefined,则调用String()函数并取得字符串"null"和"undefined";
var result = 5 + 5; //10
var result1 = 5 + "5"; //55,第二个操作数是字符串5,则拼接起来了
//from page 48
下面例子:num1+num2用括号括起来会使两者数值相加再与前面的字符串拼接起来;
var num1 = 5;
var num2 = 10;
var mess = "The sum of 5 and 10 is " + num1 + num2; //The sum of 5 and 10 is 510;
var mess1 = "The sum of 5 and 10 is " + (num1 + num2); //The sum of 5 and 10 is 15;
//from page 49
2.减法
减法操作符用(-)表示;
var result = 2 - 1;
规则如下:
① 如果两个操作符都是数值,则执行常规的算术减法
② 如果有一个操作数是NaN,则结果是NaN;
③ 如果是Infinity减Infinity,则结果是NaN;
④ 如果是-Infinity减-Infinity,则结果是NaN;
⑤ 如果是Infinity减-Infinity,则结果是Infinity;
⑥ 如果是-Infinity减Infinity,则结果是-Infinity;
⑦ 如果是+0减+0;则结果是+0;
⑧ 如果是-0减+0;则结果是-0;
⑨ 如果是-0减-0;则结果是+0;
⑩ 如果有一个操作数是字符串、布尔值、null、undefined,则后台调用Number()转换为数值再执行以上规则;
⑪ 如果有一个操作数是对象,则调用对象的valueOf()取得该对象的数值;
3.5.6 关系操作符
小于(<)、大于(>)、小于等于(<=)和大于等于(>=);
规则:
① 如果两个操作数都是数值,执行数值比较
② 如果两个操作数都是字符串,则比较字符串的对应的字符编码;
③ 如果一个操作数是数值,则将另一个操作数转换为数值,再执行数值比较;
④ 如果一个操作数是对象,则先调用valueOf()方法,再应用以上规则;
⑤ 如果一个操作数是布尔值,先转换成数值再比较;
看下面的例子:
var result = "Brick" < "alphabet"; //true; 由于大写字母的字符编码都小于小写字母的字符编码
var result = "23" < "3"; //true; 两个字符串其实是比较"2"(编码是50)和"3"(编码是51)的字符编码
var result = "23" < 3; //false; 字符串23被转成数值
var result = "a" <3; //false; 字符串a无法转换成数值(参考规则第3点),a被转换成NaN
var result = NaN <3; //false;
var result = NaN >= 3; //false
//from page 51
3.5.7 相等操作符
1.相等和不相等
两种都是强制转型,先转换再比较。相等用(==)表示,两个操作数相等返回true;不等用(!=)表示,两个操作数不等返回true。
基本规则:
① 如果两个操作数都是布尔值,先转换成数值
② 如果一个操作数是字符串,另一个是数值,则先将字符串转换成数值;
③ 如果一个操作数是对象,另一个不是,则调用valueOf()方法,再应用以上规则
④ null和undefined 是相等的
⑤ 比较相等性之前,不能将null和undefined转换成其他任何值;
⑥ 如果有一个操作数是NaN,则相等操作符返回false,不等操作符返回true;
⑦ 如果两个操作符都是对象,则比较他们是不是同一对象;
表达式 | null==undefined | "NaN"==NaN | 5==NaN | NaN==NaN | NaN!=NaN | false==0 | true==1 | "5"==5 | undefined==0 | null==0 |
---|---|---|---|---|---|---|---|---|---|---|
值 | true | false | false | false | true | true | true | true | false | false |
2.全等和不全等
不转换仅比较,数据类型必须相同。全等用(===)表示,两个操作数全等返回true;不等用(!==)表示,两个操作数不全等返回true。
var result1 = ("55" == 55); //true, 因为转换后相等
var result2 = ("55" === 55); //false, 因为不同的数据类型
var result3 = ("55" != 55); //false, 因为转换后相等
var result4 = ("55" !== 55); //true, 因为不同的数据类型
//from page 52
值得注意的是:null和undefined
var result1 = (null == undefined); //true;
var result2 = (null === undefined); //false; 因为他们是不同类型的值
3.5.8 条件操作符
也就是三元运算符,基本格式是:variable = boolean_expression ? true_value : false_value;
例子:
var max = (num1 > num2) ? num1 : num2;
//如果num1>num2为true则将num1赋给变量max,否则将num2赋给变量max
3.5.9 赋值操作符
简单赋值操作(=),如下:
var num = 2;
符合赋值操作,如下:
var num = 10;
num += 10; //20, 这一行相当于num = num + 10;
每个算术操作符都有符合赋值操作:
乘/赋值 | 除/赋值 | 模/赋值 | 加/赋值 | 减/赋值 | 左移/赋值 | 有符号右移/赋值 | 无符号/赋值 |
*= | /= | %= | += | -+= | <<= | >>= | >>>= |
3.5.10 逗号操作符
逗号操作符可以在一条语句中执行多个操作
var num1=1 , num2=2 , num3=3; //声明多个变量