乘性操作符
ECMAScript 定义了3个乘性操作符,乘法,除法,和取模。这些操作符和他们在java,c语言及perl中对应的操作符作用一样,但在处理非数值时,他们也会包含一些自动类型转换。如果乘性操作符有不是数值的操作数,该操作数会在后台被使用Number()转型为数值后,再进行计算。这意味着空字符串会被当成0,而布尔值true 会被当成1.
指数操作符
ECMASCript 7新增了指数操作符,Math.pow()现在有了自己的操作符,结果是一样的。
console.log(Math.pow(3,3));//9
console.log(3 ** 2);// 9
console.log(Math.pow(9,0.5));//3
console.log(9 ** 0.5);//3
不仅如此,指数操作符也有自己的指数赋值操作符**=,该操作符执行指数运算和结果的赋值操作:
let squared = 3;
squared **= 2;
console.log(squared);// 9
加法操作符
对于加法操作符,如果有一个操作数是字符串,则要应用如下规则:
如果两个操作数都是字符串,则将第二个字符串拼接到第一个字符串后面。
如果只有一个操作符是字符串,则将另一个操作数转换为字符串,再将两个字符串拼接在一起。
如果有人任一操作数是对象,数值或布尔值,则调用他们的toString()方法以获取字符串,然后再应用前面关于字符串的规则。对于undefined和null,则调用String()函数,分别获取“undefined”和“null”;
ECMAScript 中最常犯的一个错误,就是忽略加法操作中操作数涉及的数据类型。
let num1 = 5;
let num2 = 10;
let message = "The sum of 5 and 10 is " + num1 + num2;
console.log(message); // "The sum of 5 and 10 is 510"
第一次加法的操作数是一个字符串和一个数值(5),结果还是一个字符串。第二次加法仍然是一个字符串和一个数值(10),同样也会得到一个字符串。
解决方法:
let num1 = 5;
let num2 = 10;
let message = "The sum of 5 and 10 is " + (num1 + num2);
console.log(message); // "The sum of 5 and 10 is 510"
减法操作符
对于减法操作符,如果有任一操作数是字符串,布尔值,null或defined,则先在后台用Number()将其转换为数值,然后再计算。如果转换结果是NaN,则减法计算的结果是NaN.
如果有任一操作数是对象,则调用其valueOf()方法取得他的数值,如果该值是NaN,则减法计算的结果是NaN。如果对象没有valueOf方法,则调用起toString()方法,然后再将得到的字符串转换为数值。
关系操作符
在使用关系操作符比较两个字符串时,会发生一个有趣的现象。很多人认为小于意味着“字母顺序靠前”,而大于意味着“字符顺序靠后”,实际上不是这么回事。对字符串而言,关系操作符会比较字符串中对应的字符的编码,而这些编码是数值。比较完后,会返回布尔值。问题的关键在于,大写字母的编码都小于小写字母的编码,因此以下这种情况就会产生:
let result = "Brick" < "alphabet";// true
"Brick" 被认为小于字符串 "alphabet",因为字母B的字符编码是66,字母a的编码是97.要得到确实按字母顺序比较的结果,就必须把两者都转换为相同的大小写形式(全大写或全小写),然后再比较:
let result = "Brick".toLowerCase() < "alphabet".toLowerCase();// false
另外一个问题是在比较两个数值字符串时:
let result = "23" < "3";//true
这里比较字符串“23”和“3”时返回true。因为两个操作数都是字符串,所以会挨个比较他们的字符编码(字符“2”的编码是50,而字符“3”的编码是51)。
另外,任何关系操作符在涉及比较NaN时都返回false。
let result = “a” < 3;//因为“a”会转换为NaN,所以结果是false
let result = NaN < 3;//false
let result2 = NaN >=3; //false
相等操作符
ECMAScript 提供了两组操作符。第一组是等于和不等于,它们在比较之前执行转换。第二组是全等和不全等,他们在比较前不执行转换。
等于和不等于
ECMAScript 中的等于操作符用两个等于号(==)表示,如果操作数相等,则返回true。不等于操作符用叹号和等于号(!=)表示,如果两个操作数不相等,则返回true。这两个操作符都会先进行类型转换(通常称为强制类型转换)再确定操作数是否相等。
在转换操作数的类型时,相等和不相等操作符遵循如下规则:
如果任一操作数时布尔值,则将其转换为数值再比较是否相等。false 转换为0,true 转换为1。
如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等。
如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法取得其原始值,在根据前面的规则进行比较。
在进行比较时,这两个操作符会遵循如下规则:
null 和undefined 相等。
null 和 undefined 不能转换为其他类型的值再进行比较。
如果有任一操作数是NaN,则相等操作符返回false,不相等操作符返回true。
记住,即使两个操作数都是NaN,相等操作符也返回false,因为按照规则,NaN 不等于NaN。
如果两个操作数都是对象,则比较是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true,否则,两者不相等。
逗号操作符
逗号操作符可以用来在一条语句中执行多个操作,如下所示:
let num1 =1,num2 = 2,num3 = 3
逗号操作符也可以用来辅助赋值。在赋值时使用逗号操作符分隔值,最终会返回表达式中最后一个值:
let num = (5,1,4,6,0);//num 的值为0
**标签语句
标签语句用于给语句加标签。语法如下:
label:statement
let num = 0;
outermost:
for (let i = 0 ; i < 10; i++){
for(let j = 0;j++){
if(i == 5 && j == 5){
break outermost;
}
}
num ++;
}
console.log(num);//55
此时break 会跳出外部for 循环。
let num = 0;
outermost:
for (let i = 0 ; i < 10; i++){
for(let j = 0;j++){
if(i == 5 && j == 5){
countinue outermost;
}
}
num ++;
}
console.log(num);//95
此时continue,只是跳出内部for 循环,从外部for循环继续循环。
switch语句
JavaScript的switch 语句可以用于所有数据类型。因此可以使用字符串甚至对象。