Javascript是弱类型语言,那么在进行变量比较的时候就需要多注意。
JavaScript 有 5 种原始类型: Undefined、Null、Boolean、Number 和 String。
一、对于有原始类型(number、string、boolean)参与的比较:
1)使用 “==”比较时:总是试图比较两者的“值”。如果类型不一致,则试图转换成相同类型后再比较“值”
console.info(1 == '1'); //输出 true console.info(1 == true); //输出 true console.info('1' == true); //输出 true
2)使用 “===”比较时:不作类型转换,纯粹的比较
console.info(1 === '1'); //输出 false console.info(1 === true); //输出 false console.info('1' === true); //输出 false
如果一个基本类型与一个object或function类型进行“==”比较时,则先调用object或function的valueOf后进行比较:
var obj = { valueOf: function () { console.info('valueOf'); return 1 }, toString: function () { console.info('toString'); return '1' } } console.info(1 == obj); //输出 valueOf true console.info('1' == obj); //输出 valueOf true console.info(true == obj); //输出 valueOf true console.info(1 === obj); //输出 false console.info('1' === obj); //输出 false console.info(true === obj); //输出 false
而当Object中没有valueOf函数,则调用toString方法:
var obj = { toString: function () { console.info('toString'); return '1' } } console.info(1 == obj); //输出 toString true console.info('1' == obj); //输出 toString true console.info(true == obj); //输出 toString true console.info(1 === obj); //输出 false console.info('1' === obj); //输出 false console.info(true === obj); //输出 false
二、对于只有object, function两者参与的比较:
==与===是一样的,因为是直接进行“指针地址”比较。
var obj = { valueOf: function () { console.info('valueOf'); return 1 } } var obj1 = { valueOf: function () { console.info('valueOf'); return 1 } } var obj2 = obj; console.info(obj == obj1); //输出 false console.info(obj === obj1); //输出 false console.info(obj == obj2); //输出 true console.info(obj === obj2); //输出 true
四、对于有Null、Undefined参与的比较时:
nll、undefined在与别的类型进行“===”比较时,结果都是false。而进行“==”比较的时,几乎也是false,除了如下特殊情况:
console.info(undefined == null); //输出 true