|
3.5 ECMAScript等性运算符及表达式 |
在ECMAScript语法中,判断两个变量是否相等的运算符,统称为等性运算符。等性运算符一般包括等号、非等号、全等号和非全等号这几种。其中,等号和非等号用于处理原始值,而全等号和非全等号主要用于处理对象。等性运算符表达式均会返回一个布尔值。下面对这些等性运算符逐一进行介绍。
关于ECMAScript语法中定义的等性运算符的内容详见表3-5。
表3-5 ECMAScript等性运算符与表达式
在ECMAScript语法定义中,等号是用双等号(==)来表示的,其含义是当且仅当两个运算数相等时返回布尔值true,否则返回布尔值false。而非等号是用感叹号(!)和等号(=)的组合(!=)来表示的,其含义是当且仅当两个运算数不相等时,返回布尔值true,否则返回布尔值false。
为确定两个运算数是否相等,运算前均会对这两个运算数进行类型转换。执行类型转换的基本规则如下:
而在比较运算时,等号与非等号运算符还会遵循以下规则:
下面,来看一个等号与非等号运算符表达式的代码示例(详见源代码ch03目录中ch03-js-operator-equal.html文件)。
【代码3-16】
01 <script type="text/javascript"> 02 var bR_1_1 = 1 == 2; 03 console.log("1 == 2 = " + bR_1_1); 04 var bR_1_0 = 1 != 2; 05 console.log("1 != 2 = " + bR_1_0); 06 var bR_2_0 = false == 0; 07 console.log("false == 0 = " + bR_2_0); 08 var bR_2_1 = true == 1; 09 console.log("true == 1 = " + bR_2_1); 10 var bR_2_2 = true == 2; 11 console.log("true == 2 = " + bR_2_2); 12 var bR_3 = "1" == 1; 13 console.log("'1' == 1 = " + bR_3); 14 var bR_4 = null == 0; 15 console.log("null == 0 = " + bR_4); 16 var bR_5 = undefined == 0; 17 console.log("undefined == 0 = " + bR_5); 18 var bR_6 = undefined == null; 19 console.log("undefined == null = " + bR_6); 20 var bR_7 = NaN == 1; 21 console.log("NaN == 1 = " + bR_7); 22 var bR_8 = NaN == NaN; 23 console.log("NaN == NaN = " + bR_8); 24 var bR_9 = NaN != NaN; 25 console.log("NaN != NaN = " + bR_9); 26 var bR_10 = "NaN" == NaN; 27 console.log("'NaN' == NaN = " + bR_10); 28 </script>
关于【代码3-16】的分析如下:
这段代码主要就是对数值、字符串、null、undefined和NaN等原始值分别使用了等号(==)和非等号(!=)运算符进行比较运算,具体为数值与数值、数值与字符串、null与undefined、NaN与数值和NaN与自身等进行比较运算。
页面效果如图3.18所示。
图3.18 ECMAScript等性运算符(等号与非等号)
从第03行和第05行代码输出的结果来看,等号和非等号运算符可用于判断两个运算数是否相等;
从第07行和第09行代码输出的结果来看,在对true和false进行等性运算时,会先将true转换为数值1,将false转换为数值0,然后进行比较;因此,第07行和第09行代码输出的结果都为true,而第11行代码输出的结果为false;
从第13行代码输出的结果来看,在对字符串和数值进行等性运算时,会将字符串先转换成数值,再与另一个数值进行比较;因此,第13行代码输出的结果为true;
从第15行和第17行代码输出的结果来看,null和undefined在与数值进行等性运算时,这两个原始值是不能转换为数值的;但从第19行代码输出的结果来看,在对null和undefined进行等性运算时(null == undefined),返回的结果为true,也就是说null和undefined的值是相等的;
从第21行、第23行、第25行和第27行代码输出的结果来看,原始值NaN不但与数值进行等性运算时是不相等的,且与自身进行等性运算时(NaN == NaN、"NaN" == NaN)也是不相等的;这一点也是符合ECMAScript语法中对NaN的定义。
以上就是对等号(==)和非等号(!=)运算符的测试,尤其是对原始值null、undefined和NaN的测试结果需要特别注意,希望读者多加练习、进一步理解等性运算符的使用方法。
在ECMAScript语法定义中,全等号、非全等号与等号、非等号是同类运算符,不同之处在于进行比较运算之前全等和非全等运算符不会对两个运算数进行类型转换。
ECMAScript语法规定,全等号使用三个等号(===)来表示,其只有在无须类型转换,运算数就相等的条件下,返回值才会为true。而非全等号使用感叹号(!)和两个等号(==)的组合(!==)来表示,其只有在无须类型转换,运算数就不相等的条件下,返回值才会为true。
通过对前一小节的学习,我们知道等号与非等号运算时会对运算数进行类型转换。而全等号与非全等号运算前对运算数不进行类型转换,该功能自然有其存在的意义。
下面,来看一个全等号与非全等号运算符表达式的代码示例(详见源代码ch03目录中ch03-js-operator-identi-equal.html文件)。
【代码3-17】
01 <script type="text/javascript"> 02 var iNum = 123; 03 var iStr = "123"; 04 console.log("123 == '123' = " + (iNum == iStr)); 05 console.log("123 === '123' = " + (iNum === iStr)); 06 console.log("123 != '123' = " + (iNum != iStr)); 07 console.log("123 !== '123' = " + (iNum !== iStr)); 08 var bR_1_1 = null == undefined; 09 console.log("null == undefined = " + bR_1_1); 10 var bR_1_2 = null === undefined; 11 console.log("null === undefined = " + bR_1_2); 12 var bR_2_1 = null != undefined; 13 console.log("null != undefined = " + bR_2_1); 14 var bR_2_2 = null !== undefined; 15 console.log("null !== undefined = " + bR_2_2); 16 var bR_NaN_1 = NaN == NaN; 17 console.log("NaN == NaN = " + bR_NaN_1); 18 var bR_NaN_2 = NaN === NaN; 19 console.log("NaN === NaN = " + bR_NaN_2); 20 </script>
关于【代码3-17】的分析如下:
这段代码主要就是对数值、字符串、null、undefined和NaN等原始值分别使用了全等号(===)和非全等号(!==)运算符进行了比较运算。
第02~03行代码分别定义了两个变量(iNum和iStr),其中变量(iNum)初始化为数值123,而变量(iStr)初始化为数值型字符串"123";
第04~07行代码分别使用等号(==)、非等号(!=)、全等号(===)和非全等号(!==)运算符对变量(iNum)和变量(iStr)进行了比较运算;
第08~15行代码分别使用等号(==)、非等号(!=)、全等号(===)和非全等号(!==)运算符对原始值null和undefined进行了比较运算;
第16~19行代码分别使用等号(==)和全等号(===)运算符,对NaN进行比较运算。
页面效果如图3.19所示。
图3.19 ECMAScript等性运算符(全等号与非
从第04行和第05行代码输出的结果来看,使用等号和全等号运算符对123和"123"的比较运算结果是不同的,原因就是前文中提到的,全等于运算符不会对运算数进行类型转换,自然数字123和字符串"123"是不相等的;
那么从第06行和第07行代码输出的结果来看,使用非等号和非全等号运算符对123和"123"的比较运算结果与使用等号和全等号运算符返回的结果正好相反;
第09行代码使用等号的输出结果我们在【代码3-16】的解释中已经介绍,而与之相对应的是第11行代码,使用全等号的输出的结果正好与之相反,即表达式(null === undefined)的返回值为false;
从第13行和第15行代码输出的结果来看,使用非等号和非全等号运算符对null和undefined的比较结果与使用等号和全等号运算符返回的结果正好相反;
最后,从第17行和第19行代码输出的结果来看,对于原始值NaN与其自身,无论是使用等号还是全等号进行比较运算,返回后结果均为false,这一点也是符合ECMAScript语法中对NaN的定义。
以上就是对全等号(===)和非全等于(!==)运算符的测试,尤其是对原始值null、undefined和NaN的测试过程需要特别注意,希望能帮助读者加深领会等性运算符的使用特点。