前言:在JavaScript中,各种数据类型和情况下在“if”中的判断总结。
(1)基本类型判断
- 字符串类型
var t = '';
if (t) {
console.log("true");
} else {
console.log("false");
} //false
var t=" ";
if (t) {
console.log("true");
} else {
console.log("false");
} //true
结论:非空即为真
- 数据类型
var t = 0;
if (t) {
console.log("true");
} else {
console.log("false");
} //false, t=0.0亦如此
var t = NaN;
if (t) {
console.log("true");
} else {
console.log("false");
} //false
var t = Infinity;
if (t) {
console.log("true");
} else {
console.log("false");
} //true
结论:非零,非NaN为真
- Null和Undefined类型
var t = null;
if (t) {
console.log("true");
} else {
console.log("false");
} //false, t=0.0亦如此
var t = undefined;
if (t) {
console.log("true");
} else {
console.log("false");
} //false, t=0.0亦如此
结论:null和undefined都是假
(2)复杂数据类型判断
- 函数
function testfunction () {
};
if (testfunction) {
console.log("true");
} else {
console.log("false");
} //true
function testfunction () {
};
if (testfunction()) {
console.log("true");
} else {
console.log("false");
} //false,因为无返回值,即为undefined
function testfunction () {
return function () {
};
};
if (testfunction()) {
console.log("true");
} else {
console.log("false");
} //true
结论:只要是已定义的函数对象即为真,若是调用函数,则根据返回值的结果做判断
- 数组和对象
var t = {};
if (t) {
console.log("true");
} else {
console.log("false");
} //true
var t = [];
if (t) {
console.log("true");
} else {
console.log("false");
} //true
var t = {a:[]};
if (t.a) {
console.log("true");
} else {
console.log("false");
} //true
结论:只要是已定义的数组和对象,不管有无内容,都为真,但获取其属性字段,则按字段值结果做判断。
总结:null和undefined是假。对于数值类型,非零和非NaN是真;对于字符类型除空字符串是假,其他都为真,对于对象和方法属性,如果定义了就是真,否则就是假,其他所有情况都可以看做是对null和undefined的判断的变相应用;
(3)特殊情况下的if判断
- null和undefined之间的判断
if (null == undefined) {
console.log("true");
} else {
console.log("false");
} //true
if (null === undefined) {
console.log("true");
} else {
console.log("false");
} //false
20161108164017219.png提示:"=="的比较规则
1、如果两个值类型相同,进行 === 比较。
2、如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:a、如果一个是null、一个是undefined,那么相等
b、如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。
c、如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。
d、如果一个是对象,另一个基本类型,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。js核心内置类,会尝试valueOf先于toString
怎么看?
红色:===
橙色:==
黄色:<= 和 >= 同时成立,== 不成立
蓝色:只有 >=
绿色:只有 <=
白色:不成立
结论:在"=="比较的时候会转换数据类型,而"==="比较严格,只要类型不同即判断为假。在实际中,undefined是派生于null的,因此在js标准中规定两者在"=="情况下的相等性测试结果为真。这也是为何在做相等性测试时候使用"===".
- NaN和undefined和null之间的判断
if (NaN == undefined) {
console.log("true");
} else {
console.log("false");
} //false
if (NaN == null) {
console.log("true");
} else {
console.log("false");
} //false
if (NaN == NaN) {
console.log("true");
} else {
console.log("false");
} //false
结论:NaN连与自身都不相等
- 引用类型之间的判断
// 对象赋值
var a = {};
var b = a;
if (a === b) {
console.log("true");
} else {
console.log("false");
} //true
// 对象直接定义
var a = {};
var b = {};
if (a === b) {
console.log("true");
} else {
console.log("false");
} //false
// 浅拷贝
var a = { a: {a: "hello"} };
var b = Object.assign({}, a);
if (a === b) {
console.log("true");
} else {
console.log("false");
} //false
// 深拷贝
var a = {
c: 1
};
var b = JSON.parse(JSON.stringify(obj));
if (a === b) {
console.log("true");
} else {
console.log("false");
} //false
// new方式创建实例
function a () {};
var b = new a;
if (a === b) {
console.log("true");
} else {
console.log("false");
} //false
结论:引用类型的比较是引用的比较,也就是内存堆指针的比较,所以无论是哪种拷贝还是创建实例,只要在内存堆里开辟了新空间的变量比较的时候都是为假。
网友评论