JS灵巧判断7种类型的方式

1、空值 (null)
2、未定义 (undefined)
3、布尔值 (boolean)
4、数字 (number)
5、字符串 (string)
6、对象 (object)
7、符号 (symbol,ES6中新增)

1,可以使用 typeof 判断方式,如下:

typeof null         // "object"         <= 在后面文章里你会看到,巨坑!!!
typeof undefined            // "undefined"
typeof true         // "boolean
typeof 42                       // "number"
typeof "42"         // "string"
typeof {life: 42}                // "object"
typeof Symbol()     // "symbol"
// ------------后面3种是单独提出来的注意事项------------------
typeof void 0               // "undefined"      <= 这是一个非常实用的技巧,我将在后面解释;
typeof [1,2,3]              // "object"         <= 数组 其实也是对象,巨坑!!!
typeof function a() { } // "object"  <= 这里也需要注意!!!函数也是构造于 object

我们可以看到,这种判断方式虽说简单,但是太粗糙了,我们要判断对象具体的类型,则无能为力了。

2、巧用 !

我们要判断出 null undefined ,可以使用“!”来判断

!null              // true             <= 这是一个非常巧妙的技巧,下面将解释;
!undefined     // true         <= 这是一个非常巧妙的技巧,下面将解释;
------------我们不一样!!!------------
!123              // false
!true             // false
!{a: 123}         // false
!function a() { }  // false
!'123'            // false

注意:对象的boolean全是true

3、无敌法 “toString.call()”

Object.prototype.toString.call(null)        // "[object Null]"
Object.prototype.toString.call(undefined)   // "[object Undefined]"
Object.prototype.toString.call(123)         // "[object Number]"
Object.prototype.toString.call(true)        // "[object Boolean]"
Object.prototype.toString.call('123')       // "[object String]"
Object.prototype.toString.call({a: 123})    // "[object Object]"
Object.prototype.toString.call(Symbol())    // "[object Symbol]"
// ---------------单独出来讲的几个注意事项---------------------
Object.prototype.toString.call([1,2,3]) // "[object Array]"
Object.prototype.toString.call(function a() { })    // "[object Function]" 其实函数也是object类型
Object.prototype.toString.call(new Date)    // "[object Date]"  日期对象
Object.prototype.toString.call(Math)        // [object Math]    数学函数对象
Object.prototype.toString.call(function a() { })    // "[object Function]" 其实函数也是object类型

当然 Object.prototype.toString.call 也可以换成 Object.prototype.toString.apply
但是,你要知道,再厉害的绝技,也有他的命门所在。
他的命门就是:存在兼容性问题,具体兼容性问题点击这里 ,JavaScript 1.8.5,无法完全检测上述情况。

4、来看看 " constructor "吧

var n1 = null;
n.constructor             // 报错:因为 null 是 JS 原型链的起点,没有构造函数;
var u = undefined;
u.constructor             // 报错:它也没有构造函数;
var a = [1, 2, 3];
a.constructor === Array;   // true  数组
var n = 123;
n.constructor === Number;  // true  数字
var s1 = '123';
abc.constructor === String  // true 字符串
var o = {a: 123};
o.constructor === Object;   // true 对象
var s = Symbol()
abc.constructor === Symbol  // true 符号
//------------------单独出来讲的几个注意事项----------------------
var arr = [1, 2, 3];
arr.constructor === Array   // true 数组 能够很好地区分
var fun = function a() { };
fun.constructor === Function  // true 函数
var abc = new Date();
abc.constructor === Date;    // true 日期 
var abc = new RegExp();
abc.constructor === RegExp; // true 正则 
var abc = Math
abc.constructor === Math;   // false 不可以像Object.prototype.toString.call()一样区分;
abc.constructor === Object   // true 事实上没有Math这个构造函数,Math的构造函数在 Object上的

[文章来源] :https://www.tuicool.com/articles/riABvmV?utm_medium=hao.caibaojian.com&utm_source=hao.caibaojian.com

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

推荐阅读更多精彩内容

  • 1.通过typeof可以判断处几种基本数据类型Boolean,number,string,null,undefin...
    舟渔行舟阅读 625评论 0 1
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,114评论 0 13
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,521评论 0 5
  • JS使用技巧专题 1开发技巧 1.1函数使用 1.1.1函数声明方式 JS函数的写法总结 http://blog....
    Kevin_Junbaozi阅读 1,066评论 0 11
  • 没有特别计划,几个从小一块长大的兄弟,一经我鼓噪,说去爬庐山,一拍即合,说走就走。 不顾舟车劳顿,一行人集合后便在...
    达落阅读 1,421评论 2 8