demo

JavaScript 一共提供了8个比较运算符。

  • 大于运算符

  • < 小于运算符
  • <= 小于或等于运算符
  • = 大于或等于运算符

  • == 相等运算符
  • === 严格相等运算符
  • != 不相等运算符
  • !== 严格不相等运算符

非相等运算符

字符串按照字典顺序进行比较 'cat' > 'dog' // false '大' > '小' // false
两个运算子都是原始类型的值,则是先转成数值再比较

  1. 5 > '4' // true
  2. // 等同于 5 > Number('4')
  3. // 即 5 > 4
  4. true > false // true
  5. // 等同于 Number(true) > Number(false)
  6. // 即 1 > 0

任何值(包括NaN本身)与NaN比较,返回的都是false

  1. 1 > NaN // false
  2. 1 <= NaN // false
  3. '1' > NaN // false
  4. '1' <= NaN // false
  5. NaN > NaN // false
  6. NaN <= NaN // false

如果运算子是对象,会转为原始类型的值,再进行比较,对象转换成原始类型的值,算法是先调用valueOf方法;如果返回的还是对象,再接着调用toString方法,不会先调用toString方法

  1. var x = [2];
  2. x > '11' // true
  3. // 等同于 [2].valueOf().toString() > '11'
  4. // 即 '2' > '11'
  5. x.valueOf = function () { return '1' };
  6. x > '11' // false
  7. // 等同于 [2].valueOf() > '11'
  8. // 即 '1' > '11'
  9. { x: 2 } >= { x: 1 } // true
  10. // 等同于 { x: 2 }.valueOf().toString() >= { x: 1 }.valueOf().toString()
  11. // 即 '[object Object]' >= '[object Object]'

valueOf and toString

  1. var arr = [1,2,3,4];
  2. console.log(arr.valueOf(),arr.toString(),arr.valueOf().toString());
  3. // [ 1, 2, 3, 4 ] '1,2,3,4' '1,2,3,4'
  4. var frr = function (){
  5. return '1,2,3,4'
  6. }
  7. console.log(frr.valueOf(),frr.toString(),frr.valueOf().toString());
  8. // [Function: frr] 'function (){\r\n return \'1,2,3,4\'\r\n}' 'function (){\r\n return \'1,2,3,4\'\r\n}'
  9. var orr = {
  10. p : 1,
  11. a : 2,
  12. b : 3,
  13. c : 4
  14. };
  15. console.log(orr.valueOf(),orr.toString(),orr.valueOf().toString());
  16. // { p: 1, a: 2, b: 3, c: 4 } '[object Object]' '[object Object]'

严格相等和不相等运算符

如果两个值的类型不同,直接返回false
1 === "1" // false true === "true" // false
NaN === NaN // false +0 === -0 // true

两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址

  1. {} === {} // false
  2. [] === [] // false
  3. (function () {} === function () {}) // false
  4. var v1 = {};
  5. var v2 = v1;
  6. v1 === v2 // true

undefined 和 null
undefined === undefined // true null === null // true

相等运算符

原始类型的值会转换成数值再进行比较。

  1. 1 == true // true
  2. // 等同于 1 === Number(true)
  3. 0 == false // true
  4. // 等同于 0 === Number(false)
  5. 2 == true // false
  6. // 等同于 2 === Number(true)
  7. 2 == false // false
  8. // 等同于 2 === Number(false)
  9. 'true' == true // false
  10. // 等同于 Number('true') === Number(true)
  11. // 等同于 NaN === 1
  12. '' == 0 // true
  13. // 等同于 Number('') === 0
  14. // 等同于 0 === 0
  15. '' == false // true
  16. // 等同于 Number('') === Number(false)
  17. // 等同于 0 === 0
  18. '1' == true // true
  19. // 等同于 Number('1') === Number(true)
  20. // 等同于 1 === 1
  21. '\n 123 \t' == 123 // true
  22. // 因为字符串转为数字时,省略前置和后置的空格

对象与原始类型值比较

  1. // 对象与数值比较时,对象转为数值
  2. [1] == 1 // true
  3. // 等同于 Number([1]) == 1
  4. // 对象与字符串比较时,对象转为字符串
  5. [1] == '1' // true
  6. // 等同于 String([1]) == '1'
  7. [1, 2] == '1,2' // true
  8. // 等同于 String([1, 2]) == '1,2'
  9. // 对象与布尔值比较时,两边都转为数值
  10. [1] == true // true
  11. // 等同于 Number([1]) == Number(true)
  12. [2] == true // false
  13. // 等同于 Number([2]) == Number(true)

undefined 和 null

  1. false == null // false
  2. false == undefined // false
  3. 0 == null // false
  4. 0 == undefined // false
  5. undefined == null // true

相等运算符的缺点

  1. 0 == '' // true
  2. 0 == '0' // true
  3. 2 == true // false
  4. 2 == false // false
  5. false == 'false' // false
  6. false == '0' // true
  7. false == undefined // false
  8. false == null // false
  9. null == undefined // true
  10. ' \t\r\n ' == 0 // true