1、乘性操作符
ECMAScript定义了三种乘性操作符,分别是:乘法、除法和取模。
如果乘性操作符有不是数值的操作数,则该操作数会在后台被使用 Number()转型函数转换为数值。这意味着空字符串会被当成 0,而布尔值 true 会被当成 1。
① 乘法操作符
乘法操作符由一个星号( *)表示,可以用于计算两个数值的乘积。其语法类似于 C 语言。
let res = 45*11;
❃ 如果 ECMAScript 不能表示乘积,则返回 Infinity(正无穷大) 或-Infinity(负无穷大);
❃ 如果有任一操作数是 NaN,则返回 NaN;
❃ 如果是 Infinity 乘以 0,则返回 NaN;
❃ 如果是 Infinity 乘以非 0 的有限数值,则根据第二个操作数的符号返回 Infinity 或-Infinity;
❃ 如果是 Infinity 乘以 Infinity,则返回 Infinity;
❃ 如果有不是数值的操作数,则先在后台用 Number()将其转换为数值,然后再应用上述规则 ;
② 除法操作符
除法操作符由一个斜杠( /)表示,用于计算第一个操作数除以第二个操作数的商:
let res = 22/11;
❃ 如果 ECMAScript不能表示商, 则返回Infinity 或-Infinity;
❃ 如果有任一操作数是 NaN,则返回 NaN ;
❃ 如果是 Infinity 除以 Infinity,则返回 NaN;
❃ 如果是 0 除以 0,则返回 NaN;
❃ 如果是非 0 的有限值除以 0,则根据第一个操作数的符号返回 Infinity 或-Infinity;
❃ 如果是 Infinity 除以任何数值,则根据第二个操作数的符号返回 Infinity 或-Infinity;
❃ 如果有不是数值的操作数,则先在后台用 Number()函数将其转换为数值,然后再应用上述规则;
③ 取模操作符
取模(余数)操作符由一个百分比符号( %)表示:
let res = 6%5; //res == 1
❃ 如果操作数是数值,则执行常规除法运算,返回余数。
❃ 如果被除数是无限值,除数是有限值,则返回 NaN。
❃ 如果被除数是有限值,除数是 0,则返回 NaN。
❃ 如果是 Infinity 除以 Infinity,则返回 NaN。
❃ 如果被除数是有限值,除数是无限值,则返回被除数。
❃ 如果被除数是 0,除数不是 0,则返回 0。
❃ 如果有不是数值的操作数,则先在后台用 Number()函数将其转换为数值,然后再应用上述规则。
2、指数操作符
ECMAScript 7 新增了指数操作符, Math.pow()现在有了自己的操作符**,结果是一样的:
console.log(Math.pow(3,2)); // 3的平方 9
console.log(3 ** 2); //3的平方 9
console.log(Math.pow(16,0.5)); //16开根号 4
console.log(16 ** 0.5); //16开根号 4
指数操作符也有自己的指数赋值操作符=**,该操作符执行指数运算和结果的赋值操作:
let squared = 3;
squared **= 2;
console.log(squared); // 9
let sqrt = 16;
sqrt **= 0.5;
console.log(sqrt); // 4
3、加性操作符
加法和减法操作符。
① 加法操作符
加法操作符( +)用于求两个数的和。
let res = 12+13;
✄ 如果有任一操作数是 NaN,则返回 NaN;
✄ 如果是 Infinity 加 Infinity,则返回 Infinity;
✄ 如果是-Infinity 加-Infinity,则返回-Infinity;
✄ 如果是 Infinity 加-Infinity,则返回 NaN;
✄ 如果是+0 加+0,则返回+0;
✄ 如果是-0 加-0,则返回-0。
不过,如果有一个操作数是字符串,则要应用如下规则:
✄ 如果两个操作数都是字符串,则将第二个字符串拼接到第一个字符串后面;
✄ 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,再将两个字符串拼接在一起。
let result1 = 5 + 5; // 两个数值
console.log(result1); // 10
let result2 = 5 + "5"; // 一个数值和一个字符串
console.log(result2); // "55
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"
如果想真正执行数学计算,然后把结果追加到字符串末尾,只要使用一对括号即可:
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 15"
② 减法操作符
let res = 3-2;
◎ 如果两个操作数都是数值,则执行数学减法运算并返回结果。
◎ 如果有任一操作数是 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()将其转
换为数值,然后再根据前面的规则执行数学运算。如果转换结果是 NaN,则减法计算的结果是
NaN。
◎ 如果有任一操作数是对象,则调用其 valueOf()方法取得表示它的数值。如果该值是 NaN,则
减法计算的结果是 NaN。如果对象没有 valueOf()方法,则调用其 toString()方法,然后再
将得到的字符串转换为数值。
let result1 = 5 - true; // true 被转换为 1,所以结果是 4
let result2 = NaN - 1; // NaN
let result3 = 5 - 3; // 2
let result4 = 5 - ""; // ""被转换为 0,所以结果是 5
let result5 = 5 - "2"; // "2"被转换为 2,所以结果是 3
let result6 = 5 - null; // null 被转换为 0,所以结果是 5
4、关系操作符
关系操作符执行比较两个值的操作,包括小于( <)、大于( >)、小于等于( <=)和大于等于( >=)。
let result1 = 5 > 3; // true
let result2 = 5 < 3; // false
Θ 如果操作数都是数值,则执行数值比较。
Θ 如果操作数都是字符串,则逐个比较字符串中对应字符的编码。
Θ 如果有任一操作数是数值,则将另一个操作数转换为数值,执行数值比较。
Θ 如果有任一操作数是对象,则调用其 valueOf()方法,取得结果后再根据前面的规则执行比较。
Θ 如果没有 valueOf()操作符,则调用 toString()方法,取得结果后再根据前面的规则执行比较。
Θ 如果有任一操作数是布尔值,则将其转换为数值再执行比较。
大写字母的编码都小于小写字母的编码,因此以下这种情况就会发生:
let result = "Brick" < "alphabet"; // true
因为字母 B 的编码是 66,字母 a 的编码是 97。
将两个操作数都转换为小写,就能保证按照字母表顺序判定"alphabet"在"Brick"前头。
let str1 = "Brick";
let str2 = "alphabet"
let result = str1.toLowerCase() < str2.toLowerCase(); // false
在比较数值字符串(两个比较值都是数值)的时候,又会出现另外一种情况:
let result = "23" < "3"; // true
如果两个比较的对象只有一个是数值字符串,就会出现另外一种情况:
let result = "23" < 3; // false
因为这次比较会先把“23”先转化为数值23,而后再进行比较。
但是,如果字符串不能转化为数值,新的情况就出现了:
let result = "a" < 2; //因为"a"会转换为 NaN,所以结果是 false
任何关系操作符在涉及比较 NaN 时都返回 false
let res1 = NaN < 3; //false
let res2 = NaN >= 66; //false
5、相等操作符
第一组是等于和不等于,它们在比较之前执行转换;
第二组是全等和不全等,它们在比较之前不执行转换。
① 等于和不等于
等于操作符用两个等于号( ==)表示,如果操作数相等,则会返回 true。不等于操作符用叹号和等于号( !=)表示,如果两个操作数不相等,则会返回 true。这一组操作符在比较之前会先执行强制类型转换。
转换规则如下:
✪ 如果任一操作数是布尔值,则将其转换为数值再比较是否相等。 false 转换为 0, true 转换为 1。
✪ 如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等。
✪ 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法取得其原始值,再根据前面的规则进 行比较。
进行比较时,规则如下:
✪ null 和 undefined 相等。
✪ null 和 undefined 不能转换为其他类型的值再进行比较。
✪ 如果有任一操作数是 NaN,则相等操作符返回 false,不相等操作符返回 true。即使两个操作数是 NaN,相等 操作符也返回 false,因为按照规则, NaN 不等于 NaN。
✪ 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符 返回 true。否则,两者不相等。
② 全等和不全等
全等和不全等操作符与相等和不相等操作符类似,只不过它们在比较相等时不转换操作数。全等操作符由 3 个等于号( ===)表示,只有两个操作数在不转换的前提下相等才返回 true。
let result1 = ("55" == 55); // true,转换后相等
let result2 = ("55" === 55); // false,不相等,因为数据类型不同
不全等操作符用一个叹号和两个等于号( !==)表示,只有两个操作数在不转换的前提下不相等才返回 true。
let result1 = ("55" != 55); // false,转换后相等
let result2 = ("55" !== 55); // true,不相等,因为数据类型不同
6、条件操作符
条件操作符是 ECMAScript 中用途最为广泛的操作符之一;
variable = boolean_expression ? true_value : false_value;
上面的代码执行了条件赋值操作,即根据条件表达式boolean_expression的值决定将哪个值赋给变量 variable。 如果boolean_expression是true,则赋值true_value;如 果boolean_expression是 false,则赋值 false_value。
let max = (3>2) ? 15:19; // max = 15
7、赋值操作符
简单赋值用等于号( =)表示,将右手边的值赋给左手边的变量 。
let num = 10;
复合赋值使用乘性、加性或位操作符后跟等于号( =)表示。
let num = 10;
num = num + 10;
//上述代码简写为
let num = 10;
num += 10;
☞ 乘后赋值( *=)
☞ 除后赋值( /=)
☞ 取模后赋值( %=)
☞ 加后赋值( +=)
☞ 减后赋值( -=)
☞ 左移后赋值( <<=)
☞ 右移后赋值( >>=)
☞ 无符号右移后赋值( >>>=)