美文网首页
数据类型(二)

数据类型(二)

作者: 隔壁桌的郑先生 | 来源:发表于2018-08-28 16:30 被阅读0次

前言:在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

提示:"=="的比较规则
1、如果两个值类型相同,进行 === 比较。
2、如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:

a、如果一个是null、一个是undefined,那么相等
b、如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。
c、如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。
d、如果一个是对象,另一个基本类型,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。js核心内置类,会尝试valueOf先于toString

20161108164017219.png

怎么看?

红色:===
橙色:==
黄色:<= 和 >= 同时成立,== 不成立
蓝色:只有 >=
绿色:只有 <=
白色:不成立

结论:在"=="比较的时候会转换数据类型,而"==="比较严格,只要类型不同即判断为假。在实际中,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

结论:引用类型的比较是引用的比较,也就是内存堆指针的比较,所以无论是哪种拷贝还是创建实例,只要在内存堆里开辟了新空间的变量比较的时候都是为假。

相关文章

网友评论

      本文标题:数据类型(二)

      本文链接:https://www.haomeiwen.com/subject/swstwftx.html