|
3.2 ECMAScript乘性运算符及表达式 |
ECMAScript语法中将乘法(*)、除法(/)和模数(%)运算符统一称为乘性运算符,用于执行数值之间的乘除和取余算术运算。
关于ECMAScript语法中定义的乘性运算符的内容详见表3-2。
表3-2 ECMAScript乘性运算符与表达式
ECMAScript语法中规定乘法运算符使用符号“*”来表示,乘法(*)运算符除了可以进行正常的数值运算外,还支持对类似“NaN”和“Infinity”特殊值的运算。
下面,来看一个应用ECMAScript乘法(*)运算符的代码示例(详见源代码ch03目录中ch03-js-operator-multiple.html文件)。
【代码3-4】
01 <script type="text/javascript"> 02 var i = 123; 03 var j = 321; 04 var sum = i * j; 05 console.log("123 * 321 = " + sum); 06 var a = 1e1001; 07 var sumAA = a * a; 08 console.log("1e1001 * 1e1001 = " + sumAA); 09 var sumAB = -a * a; 10 console.log("-1e1001 * 1e1001 = " + sumAB); 11 var p = NaN; 12 var q = 5; 13 var sumNaN = p * q; 14 console.log("NaN * 5 = " + sumNaN); 15 var x = Infinity; 16 var y = 0; 17 var sumInfinity = x * y; 18 console.log("Infinity * 0 = " + sumInfinity); 19 var z = 1; 20 var sumZ = x * z; 21 console.log("Infinity * 1 = " + sumZ); 22 var zz = -1; 23 var sumZZ = x * zz; 24 console.log("Infinity * (-1) = " + sumZZ); 25 var sumSum = Infinity * Infinity; 26 console.log("Infinity * Infinity = " + sumSum); 27 </script>
关于【代码3-4】的分析如下:
第02~05行代码定义了两个变量(i和j),并通过乘法运算符(*)进行了算术运算。其中,在第04行代码中通过乘法运算符(*)将变量(i)和变量(j)进行了算术相乘运算;
第06~10行代码通过乘法运算符(*)进行了无穷大的计算。其中,第06行代码定义了一个变量(a),并初始化为科学记数法数值(1e1001);第07行和第09行代码使用乘法运算符(*)分别计算了数值(1e1001)的正负平方值;
第11~14行代码分别对特殊值(NaN)进行了算术运算。其中,第11行代码定义了变量(p),并初始化赋值为特殊值(NaN);第13行代码尝试将变量(p)与一个具体数值进行算术相乘运算;
第15~24行代码通过乘法运算符(*)对特殊值(Infinity)进行了算术运算。其中,第15行代码定义了变量(x),并初始化赋值为特殊值(Infinity);第17行代码尝试将变量(x)与数值(0)进行算术相乘运算;第20行代码尝试将变量(x)与非零数值(1)进行算术相乘运算;第23行代码尝试将变量(x)与非零数值(-1)进行算术相乘运算;
第25~26行代码通过乘法运算符(*)对特殊值(Infinity)和特殊值(Infinity)进行了算术运算,并将结果保存在变量(sumSum)中。
页面效果如图3.4所示。
图3.4 ECMAScript乘法运算符(*)
ECMAScript语法中规定除法运算符使用符号“/”来表示,除法(/)运算符除了可以进行正常的数值运算外,还支持对类似“NaN”和“Infinity”特殊值的运算。
下面,来看一个应用ECMAScript除法(/)运算符的代码示例(详见源代码ch03目录中ch03-js-operator-divide.html文件)。
【代码3-5】
01 <script type="text/javascript"> 02 var i = 128; 03 var j = 16; 04 var sum = i / j; 05 console.log("128 / 16 = " + sum); 06 var a = 1e-1001; 07 var sumAA = 1 / a; 08 console.log("1 / 1e-1001 = " + sumAA); 09 var sumAB = -1 / a; 10 console.log("-1 / 1e-1001 = " + sumAB); 11 var p = NaN; 12 var q = 2; 13 var sumNaNA = p / q; 14 console.log("NaN / 2 = " + sumNaNA); 15 var sumNaNB = q / p; 16 console.log("2 / NaN = " + sumNaNB); 17 var sumZero = 2 / 0; 18 console.log("2 / 0 = " + sumZero); 19 var sumInfinityA = Infinity / 2; 20 console.log("Infinity / 2 = " + sumInfinityA); 21 var sumInfinityB = Infinity / (-2); 22 console.log("Infinity / -2 = " + sumInfinityB); 23 var sumInfinityZero = Infinity / 0; 24 console.log("Infinity / 0 = " + sumInfinityZero); 25 var sumSum = Infinity / Infinity; 26 console.log("Infinity / Infinity = " + sumSum); 27 </script>
关于【代码3-5】的分析如下:
第02~05行代码定义了两个变量(i和j),并通过除法运算符(/)进行了算术运算。其中,在第04行代码中通过除法运算符(/)将变量(i)和变量(j)进行了算术除法运算;
第06~10行代码通过除法运算符(/)进行了生成无穷大的计算。其中,第06行代码定义了一个变量(a),并初始化为科学记数法数值(1e-1001);第07行和第09行代码使用除法运算符(/)分别计算了数值(±1)除以数值(1e-1001)的结果;
第11~16行代码分别对特殊值(NaN)进行了算术运算。其中,第11行代码定义了变量(p),并初始化赋值为特殊值(NaN);第13行代码尝试将变量(p)与一个具体数值(2)进行算术除法运算;第15行代码尝试将一个具体数值(2)与变量(p)进行算术除法运算;
第17~18行代码通过除法运算符(/)计算了数值(2)除以数值(0)的结果,也就是除数为零的运算;
第19~24行代码通过除法运算符(/)对特殊值(Infinity)进行了算术运算。其中,第19行代码计算了特殊值(Infinity)除以非零数值(2)的结果;第21行代码计算了特殊值(Infinity)除以非零数值(-2)的结果;第23行代码计算了特殊值(Infinity)除以数值(0)的结果;
第25~26行代码通过除法运算符(/)对特殊值(Infinity)和特殊值(Infinity)进行了除法运算,并将结果保存在变量(sumSum)中。
页面效果如图3.5所示。从第08行和第10行代码的输出结果来看,如果除法运算返回的结果太大或太小,那么生成的结果就是特殊值(Infinity或-Infinity)。另外,如果执行特殊值(Infinity)除以特殊值(Infinity)的算术运算,则其结果为特殊值(NaN)。
图3.5 ECMAScript除法运算符(/)
ECMAScript语法中规定取模运算符使用百分数符号“%”来表示,取模(%)运算符除了可以进行正常的数值运算外,还支持对类似“NaN”和“Infinity”特殊值的运算。
下面,来看一个应用ECMAScript取模(%)运算符的代码示例(详见源代码ch03目录中ch03-js-operator-mod.html文件)。
【代码3-6】
01 <script type="text/javascript"> 02 var i = 5; 03 var j = 3; 04 var mod = i % j; 05 console.log("5 % 3 = " + mod); 06 var modZeroDiv = 0 % 2; 07 console.log("0 % 2 = " + modZeroDiv); 08 var modDivZero = 2 % 0; 09 console.log("2 % 0 = " + modDivZero); 10 var modInfinityDiv = Infinity % 2; 11 console.log("Infinity % 2 = " + modInfinityDiv); 12 var modInfinityInfinity = Infinity % Infinity; 13 console.log("Infinity % Infinity = " + modInfinityInfinity); 14 var modDivInfinity = 2 % Infinity; 15 console.log("2 % Infinity = " + modDivInfinity); 16 </script>
关于【代码3-6】的分析如下:
第02~05行代码定义了两个变量(i和j),并通过取模(%)运算符进行算术运算。其中,在第04行代码中通过取模(%)运算符将变量(i)和变量(j)进行了算术取模运算;
第06~07行代码通过取模(%)运算符对被除数为数值(0)、除数为非零数值进行取模运算;
类似的,第08~09行代码通过取模(%)运算符对除数为数值(0)、被除数为非零数值进行取模运算;
第10~11行代码通过取模(%)运算符对被除数为特殊值(Infinity)的情况进行了取模运算;
第12~13行代码通过取模(%)运算符对被除数和除数均为特殊值(Infinity)的情况进行了取模运算;
第14~15行代码通过取模(%)运算符对除数为特殊值(Infinity)的情况进行了取模运算。
页面效果如图3.6所示。从第09行代码的输出结果来看,表达式(2 % 0 = )的运算结果为特殊值(NaN),因为除数为零的取模运算是无意义的,所以结果为特殊值(NaN);从第11行代码的输出结果来看,表达式(Infinity % 2 = )的运算结果为特殊值(NaN),因为对特殊值(Infinity)进行取模运算也是无意义的,所以结果为特殊值(NaN);从第13行代码的输出结果来看,表达式(Infinity % Infinity = )的运算结果为特殊值(NaN),说明特殊值(Infinity)对特殊值(Infinity)取模也是没有意义的;从第15行代码的输出结果来看,表达式(2 % Infinity= )的运算结果为数值(2),这就说明对任意数值进行除数为特殊值(Infinity)的取模运算,结果均为被除数本身。
图3.6 ECMAScript取模运算符(%)