数据类型(二)

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容