一.概述
二.非相等运算符
1.字符串之间比较
-
字符串按每个字符的字典顺序比较引擎内部比较的是Unicode 码点
cat > dog // falsecat > catalog // false大 > 小 // false
2.非字符串的比较
Ⅰ.原始类型
-
所有非数字原始类型都会转成数字然后比较
-
若无法转换成数字则会转换成NaN任何数据和NaN(包括NaN本身)比较都会返回false
//一 基础类型比较5 > 4 // true// 等同于 5 > Number(4)// 即 5 > 4true > false // true// 等同于 Number(true) > Number(false)// 即 1 > 02 > true // true// 等同于 2 > Number(true)// 即 2 > 12>t//false//t会转换为NaN比较会返回false//二 NaN比较1 > NaN // false1 < NaN // false1 > NaN // false1 < NaN // falseNaN > NaN // falseNaN < NaN // false
Ⅱ.对象类型
-
对象转换为原始类型再比较使用 valueOf再调用返回数据的toString方法的值进行比较
var x [2];x > 11 // true// 等同于 [2].valueOf().toString() > 11// 即 2 > 11x.valueOf function () { return 1 };x > 11 // false// 等同于 [2].valueOf() > 11// 即 1 > 11[2] > [1] // true// 等同于 [2].valueOf().toString() > [1].valueOf().toString()// 即 2 > 1[2] > [11] // true// 等同于 [2].valueOf().toString() > [11].valueOf().toString()// 即 2 > 11{ x: 2 } > { x: 1 } // true// 等同于 { x: 2 }.valueOf().toString() > { x: 1 }.valueOf().toString()// 即 [object Object] > [object Object]
三.相等性运算符
- ! 会进行类型转换再在类型内比较 !直接比较如果类型不一致直接返回false
1.严格相等运算符和严格不相等运算符
- !特性
(1).不同类型的值
-
不同类型的值直接返回false
1 "1" // falsetrue "true" // false
(2).同一类的原始类型值
-
数值、字符串、布尔值的值相同返回true如下值比较特殊
//10进制1与16进制1相同1 0x1 // trueNaN NaN // false0 -0 // true
(3).复合类型的值
-
两个复合类型对象、数组、函数的数据比较时不是比较它们的值是否相等而是比较它们是否指向同一个地址
-
对于复合函数来说!比较的是地址引用而>><<比较的是值
//比较地址{} {} // false[] [] // false(function () {} function () {}) // falsevar v1 {};var v2 v1;v1 v2 // truevar obj1 {};var obj2 {};obj1 > obj2 // true [object Object] > [object Object]obj1 < obj2 // trueobj1 obj2 // false
(4).undefined 和 null
-
undefined和null与自身严格相等
-
由于变量声明后默认值是undefined因此两个只声明未赋值的变量是相等的
undefined undefined // truenull null // truevar v1;var v2;v1 v2 // true
(5).严格不相等运算符
- 严格相等运算符有一个对应的“严格不相等运算符”!它的算法就是先求严格相等运算符的结果然后返回相反值
2.相等运算符和不相等运算符
- !特性
(1).相同类型
- 在比较相同类型的数据时与严格相等运算符完全一样
(2).不同类型原始类型值(Number,Boolean,String)
-
原始类型值会转换为数值比较
1 true // true// 等同于 1 Number(true)0 false // true// 等同于 0 Number(false)2 true // false// 等同于 2 Number(true)2 false // false// 等同于 2 Number(false)true true // false// 等同于 Number(true) Number(true)// 等同于 NaN 1 0 // true// 等同于 Number() 0// 等同于 0 0 false // true// 等同于 Number() Number(false)// 等同于 0 01 true // true// 等同于 Number(1) Number(true)// 等同于 1 1\n 123 \t 123 // true// 因为字符串转为数字时省略前置和后置的空格
(3).对象与原始类型值比较
-
对象这里指广义的对象包括数组和函数与原始类型的值比较时对象转换成原始类型的值再进行比较
// 对象与数值比较时对象转为数值[1] 1 // true// 等同于 Number([1]) 1// 对象与字符串比较时对象转为字符串[1] 1 // true// 等同于 String([1]) 1[1, 2] 1,2 // true// 等同于 String([1, 2]) 1,2// 对象与布尔值比较时两边都转为数值[1] true // true// 等同于 Number([1]) Number(true)[2] true // false// 等同于 Number([2]) Number(true)
(4).undefined 和 null
-
undefined和null与其他类型的值比较时结果都为false它们互相比较时结果为true
false null // falsefalse undefined // false0 null // false0 undefined // falseundefined null // true
(5).相等运算符的缺点
-
相等运算符隐藏的类型转换会带来一些违反直觉的结果
0 // true0 0 // true2 true // false2 false // falsefalse false // falsefalse 0 // truefalse undefined // falsefalse null // falsenull undefined // true \t\r\n 0 // true