用了一段时间的JavaScript,总是感觉这门语言非常不严谨,其中一个很难完全搞懂的地方就是比较操作符。这几天重翻JavaScript -- The Definitive Guid,做个摘要,加深理解。
JavaScript中的类型
null:一个类型只有一个值【虽然typeof(null)返回的是’object’,但它的类型仍然不是object】
undefined:一个类型只有一个值
number:数字
string:字符串
boolean:布尔值,有true和false两个值
object:key-value的集合,比如Array,String,Boolean,Date等
前五种被称为primitive值。
A === B
如果A和B类型不同,则为false
否则,如果A和B都是null,则为true
否则,如果A和B都是undefined,则为true
否则,如果A和B都是boolean,则按照boolean进行比较,
否则,如果A和B至少有一个是NaN,则为false,
否则,如果A和B都是number,则按照number方式比较,
+0=== -0,
+Infinity === +Infinity,
-Infinity === -Infinity,
+Infinity !== -Infinity
否则,如果A和B都是string,则按照整数数组的方式进行比较,
否则,A和B一定都是object,如果A和B指向同一个对象,则为true,否则为false,
A == B
如果A和B类型相同,按照A === B方式比较
否则,如果A和B一个是null,一个是undefined,则为true,
否则,如果A和B一个是number,一个是string,则把string转换为number,重新比较,
否则,如果某一个是true,则把true转换为1,重新比较,
否则,如果某一个是false,则把false转换为0,重新比较,
否则,如果A和B一个是object,另一个是number或string,把object转化为primitive,重新比较。
否则,返回false。
< > <= >=
以上运算符只能用于number和number、string和string之间的比较。
A < B
1.如果A和B有object,首先把object转换为primitive,再重新比较。
2.如果A和B都是string,则进行string比较。
3.如果A和B有任一个不是string,则把A和B转换成number,重新比较。
4.如果A和B都是number,则按照number的方式比较,并且注意以下:
+0和-0是相等的
Infinity大于任意非Infinity的number
-Infinity小于任意非-Infinity的number
如果操作符中有NaN,则总是返回false
另外,A <= B 等价于 !(A > B),与A==B和A===B的结果无关。
其它
object转化为primitive的规则,有些混乱,见JavaScript-- The Definitive Guide 3.8.3
计算string op number时,如果op为==或===或<或<=或>或>=,总是把string转换为number
计算string + number是,把number转换为string。