否则都转数字比较。Infinity比任何数字都大(除了自身),-Infinity 相反。如果一个操作数是NaN(或转NaN),结果返回false。
11 < 3; "11" < "3"; //true "11" 首个字符串 "1" 的16位Unicode 值比 "3"的16位Unicode 小 //"11".charCodeAt(0).toString(16) 31 //"3".charCodeAt(0).toString(16) 33 "11" < 3; //false "11" 转 11,false {} < 3; //false {}转原始值字符串,字符串转NaN, false null < 3; //true null 转数字最后要注意的是,<= 和 >= 比较时,并不根据 == 和 === 的规则(在下方)比较,它就仅仅表示 数值 或 字符串 之间的比较。
null >= undefined //false把左操作数转 字符串
in 运算符希望它的左操作数是一个字符串或可以转换为字符串,右操作数是一个对象。如果,右侧的对象拥有一个名为左侧操作数值的属性名,那么表达式返回true。
var point = { x:1, y:2}; "x" in point; //true point 有一个 x 的属性名 var arr = [a,b,c]; 1 in arr; //true 数组的索引就相当于 属性名! 它会把操作值 转为 布尔值(“真值”为true,“假值”为false),对布尔值求反。(结果只有true,false)
例:
console.log(!""); //true console.log(!0); //true console.log(!-0); //true console.log(!null); //true console.log(!undefined); //true console.log(!NaN); //true console.log(!false); //true!! 得到操作值 等价的 布尔值(“真值”为true,“假值”为false)
等同于 Boolean(),经常称!! 为强制转换。
例:
总结:“假值” 取反都是true, “真值”取反为false;“假值” 强制转换 都是 false, “真值”强制转换为 true
都知道 == 是判断 左右值 是否想等的。而 === 不仅判断 右右值是否想等,还要判断,类型是否一样。结果返回布尔值
== 的用法
NaN是JavaScript中唯一一个不等于任何值的(包括它自己)。(NaN == NaN) // false
一般对NaN的判断:
function isNaN(num){ return typeof num === "number" && num !== num; }注意,跟js 自带的 isNaN 方法 不一样。
左右两边类型相同1、原始值的比较
它们的比较,就是值的直接比较。
比如:
2、对象的比较
对象和原始值不同,首先,它们是可变的-----它们的值是可修改的:
var o = { x:1 }; //定义一个对象 o.x = 2; //修改x的值 var a = [1,2,3]; //数组也是可修改的 a[0] = 0; //修改数组第一个元素对象的比较并非值的比较,而是引用(内存地址)的比较。
var o1 = { x:1 }; var o2 = { x:1 }; console.log( o1 == o2 ); //false //即使 对像的属性,值完全相同, 也不相等 var o3 = o1; console.log( o1 == o3 ); //true //o3 和 o1 引用的是同一对象。(即指向的是同一块储存地址) //数组同上 左右两边类型不同如果 == 两边的 类型不同,则比较时,有以下两个个规则:
undefined等于null
其他都转数字比较
为什么undefined == null 呢?实际上,undefined 是派生自 null 的。
对象通过valueOf 或 toString 转换为原始值,原始值在对应转数字。
总结:左右两边类型不同, == 在比较时,除了(null == undefined),NaN,其他都是转为数字比较, 从来不会转为布尔值!