不要使用 == 比较数组
JavaScript 中的数组与其它编程语言的不同,不应该使用 == 运算符比较 JavaScript 中的数组。
该运算符不会对数组进行特殊处理,它会像处理任意对象那样处理数组。
让我们回顾一下规则:
仅当两个对象引用的是同一个对象时,它们才相等 ==。
如果 == 左右两个参数之中有一个参数时对象,另一个参数是原始类型,那么该对象将会被转换为原始类型,转换规则如 对象——原始值转换 一章所述。
null 和 undefined 相等 == ,且各自不等于任何其他的值。
严格比较 === 更简单,因为它不会进行类型转换。
所以,如果我们使用 == 来比较数组,除非我们比较的是两个引用同一数组的变量,否则它们永远不相等。
例如:
alert( [] == []); //false
alert([0] == [0]); //false
从技术上讲,这些数组是不同的对象。所以它们不相等。 == 运算符不会进行逐项比较。
与原始类型的比较也可能会产生看似很奇怪的结果:
alert(0 == []); //true
alert('0' == []); //false
在这里两个例子中,我们将原始类型和数组对象进行比较。因此,数组 [] 被转换为原始类型以进行比较,被转换成了一个空字符串 ‘’。
然后,接下来的比较就是原始类型之间的比较,如 类型转换 一章所述:
//在 [] 被转换为 ‘’ 后
alert(0 == ''); //true,因为 ‘’ 被转换成了数字 0
alert('0' == ''); //flase,没有进一步的类型转换,是不同的字符串
那么,我们应该如何对数组进行比较呢?
很简单,不要使用 == 运算符。而是,可以在循环中或者下一章中我们将介绍迭代方法逐项地比较它们。