JavaScript 有两种比较方式:严格比较运算符和转换类型比较运算符。对于严格比较运算符(===)来说,仅当两个操作数的类型相同且值相等为 true,而对于被广泛使用的比较运算符(==)来说,会在进行比较之前,将两个操作数转换成相同的类型。对于关系运算符(比如<=)来说,会先将操作数转为原始值,使它们类型相同,再进行比较运算。
字符串比较则是使用基于标准字典的 Unicode 值来进行比较的。
比较的特点:
- 对于两个拥有相同字符顺序,相同长度,并且每个字符的位置都匹配的字符串,应该使用严格比较运算符。
- 对于两个数值相同的数字应该使用严格比较运算符,NaN和任何值不相等,包括其自身,正数零等于负数零。
- 对于两个同为true或同为false的布尔操作数,应使用严格比较运算符。
- 不要使用严格比较运算符或比较运算符来比较两个不相等的对象。
- 当比较一个表达式和一个对象时,仅当两个操作数引用相同的对象(指针指向相同对象)。
- 对于Null 和 Undefined 类型而言,应使用严格比较运算符比较其自身,使用比较运算符进行互相比较。
相等运算符
相等(==)
比较操作符会为两个不同类型的操作数转换类型,然后进行严格比较。当两个操作数都是对象时,JavaScript会比较其内部引用,当且仅当他们的引用指向内存中的相同对象(区域)时才相等,即他们在栈内存中的引用地址相同。1
2
3
41 == 1 // true
"1" == 1 // true
1 == '1' // true
0 == false // true
不相等 (!=)
不等操作符仅当操作数不相等时返回true,如果两操作数不是同一类型,JavaScript会尝试将其转为一个合适的类型,然后进行比较。如果两操作数为对象类型,JavaScript会比较其内部引用地址,仅当他们在内存中引用不同对象时不相等。1
2
3
4
51 != 2 // true
1 != "1" // false
1 != '1' // false
1 != true // false
0 != false // false
一致/严格相等 (===)
一致运算符不会进行类型转换,仅当操作数严格相等时返回true1
2
3
43 === 3 // true
3 === '3' // false
var object1 = {"value":"key"}, object2={"value":"key"};
object1 === object2 //false
不一致/严格不相等 (!==)
1 | 3 !== '3' // true |
关系运算符
大于运算符 (>)
大于运算符仅当左操作数大于右操作数时返回true1
4 > 3 // true
大于等于运算符 (>=)
大于等于运算符当左操作数大于或等于右操作数时返回true1
24 >= 3 // true
3 >= 3 // true
小于运算符 (<)
小于运算符仅当左操作数小于右操作数时返回true1
3 < 4 // true
小于等于运算符 (<=)
小于等于运算符当左操作数小于或等于右操作数时返回true1
3 <= 4 // true
使用比较操作符
标准相等操作符(== and !=) 使用 Abstract Equality Comparison Algorithm 去比较两个操作数。当两个操作数类型不相等时,会在比较前尝试将其转换为相同类型。 e.g., 对于表达式 5 == ‘5’, 在比较前会先将右边字符串类型的操作数 5 转换为数字。
严格相等操作符 (=== and !==) 使用 Strict Equality Comparison Algorithm 并尝试对两个相同操作数进行相等比较,如果它们的类型不相等,那么永远会返回false 所以5 !== '5'。
当需要明确操作数的类型和值的时候,或者操作数的确切类型非常重要时,应使用严格相等操作符。否则,当你允许操作数在比较前进行类型转换时,可以使用标准相等操作符来比较。1
2
3
4
5var a = [1, 2, 3]
var b = [1, 2, 2]
console.log( a < b )
console.log( a == b )
console.log( a === b ) // false 引用的地址不同