里面有很多注意点:
1. undefined和null,undefined比较都是false,这一点在数组越界的时候会遇到
2.数组和对象在判断==时,并不是比较指向栈中的内容是否相等,而是判断指向栈的地址是否相等,因此
var a=[];var b=a;此时a==b是true
var a=[];var b=[];此时a==b是false
3. "true"表示的是内容为 true的字符串变量,它和Boolean类型的true有本质区别
简单说明一下判断==情况
1. 如果类型相同,这个判断很熟悉,除了(NaN==NaN返回false)以外,其他都是熟悉的情况
2. 如果类型不相同①如果两边都是undefined或null,直接返回true,如果只有一边是undefined或null,直接返回false
②如果两边都是number或string或Boolean,那么全部调用ToNumber(系统方法)进行转换判断
③*如果有一边是object,另一边只能是number或string或Boolean, 那么将object调用转换基本类型方法(ToPrimitive): toString()方法(如果没有toString)则调用valueOf()然后比较
*:其实默认并不全是toString, 系统会根据对象的首选项优先选择toString或valueOf, 一般是toString() (这里感觉理解有误,望高手指教)
*:一般来说object的toString()返回[object Object], 但是一般会改写toString方法, 例如数组对象的toString和时间对象的toString()
较简单说明一下判断<情况 (首先认识到凡是大小关系, 返回值本应当是true false undefined, 只是显示的时候会把undefined归到false一类,这就是为什么两个数据比较会出现a>b 和 a<=b 均为false)
1.先将两边表达式的值变为基本类型(即只有object会调用ToPrimitive方法(见上))
2.如果大小号两边都是字符串, 那么从前至后比较每个字符(如果没有字符,视为最小-infinite)的code unit(简单理解可以视为Unicode码比较), 如果是等于(即字符相等)则继续往后看, 如果出现>则返回false 如果出现<则返回true, 如果完全相等,则返回false
例: "abc"<"abc" 返回false "abc"<"abcde"返回true "zyx"<"zy"返回false 等等
3.如果大小号两边不全是字符串, 则全部调用ToNumber方法进行比较(如果出现NaN则返回undefined), 否则就是正常数字大小的比较
判断a>b的方法: 看b<a的返回值进行返回
判断a>=b的方法: 看a<b的返回值, a<b返回true 或undefined, 则a>=b返回false 否则返回true
判断a<=b的方法: 看a>b的返回值, a>b返回true 或undefined, 则a<=b返回false 否则返回true
|