js中如何判断一个值的类型

在js中我们有三种方法来帮助我们判断一个值的类型。

typeof运算符

console.log(typeof  123);   //number
console.log(typeof  '123');  //string
console.log(typeof  true);   //boolean
console.log(typeof  undefined);  //undefined
console.log(typeof  null);  //object
console.log(typeof  []);   //object
console.log(typeof  {});  //object
console.log(typeof  new Date());  //object
console.log(typeof  /\d/);  //object
console.log(typeof  function() {}); //function

我们从以上结果可以看出typeof的不足之处,它对于数值、字符串、布尔值分别返回numberstringboolean,函数返回functionundefined返回undefined,除此以外,其他情况都返回object
所以如果返回值为object,我们是无法得知值的类型到底是数组还是对象或者其他值。为了准确得到每个值的类型,我们必须使用js中另一个运算符instanceof。下面简单的说一下instanceof的用法。


instanceof运算符

instanceof运算符返回一个布尔值,表示指定对象是否为某个构造函数的实例。
instanceof运算符的左边是实例对象,右边是构造函数。它会检查右边构造函数的ptototype属性,是否在左边对象的原型链上。

var b =  [];
b  instanceof Array  //true
b  instanceof Object  //true

注意,instanceof运算符只能用于对象,不适用原始类型的值。


所以我们可以结合typeofinstanceof运算符的特性,来对一个值的类型做出较为准确的判断。

//得到一个值的类型
function getValueType(value) {
    var type = '';
    if (typeof value != 'object') {
        type = typeof value;
    } else {
        if (value instanceof Array) {
            type = 'array';
        } else {
            if (value instanceof Object) {
                type = 'object';
            } else {
                type = 'null';
            }
        }
    }
    return type;
}

getValueType(123);    //number
getValueType('123');  //string
getValueType(true);   //boolean
getValueType(undefined); //undefined
getValueType(null);  //null
getValueType([]);     //array
getValueType({});    //object
getValueType(function(){});  //function


Object.prototype.toString方法

console.log(Object.prototype.toString.call(2))        //[object Number]
console.log(Object.prototype.toString.call("123"))   //[object String]
console.log(Object.prototype.toString.call(true))    //[object Boolean]
console.log(Object.prototype.toString.call(null))     //[object Null]
console.log(Object.prototype.toString.call(undefined))   //[object Undefined]
console.log(Object.prototype.toString.call({}))       //[object Object]
console.log(Object.prototype.toString.call([]))         //[object Array]
console.log(Object.prototype.toString.call(/\d/i))     //[object RegExp]
console.log(Object.prototype.toString.call(Math))   //[object Math]
console.log(Object.prototype.toString.call(new Date()))  //[object Date]
console.log(Object.prototype.toString.call(function f() {}))  //[object Function]
console.log(Object.prototype.toString.call(new Error()))    //[object Error]

利用以上特性,我们可以写出一个更为准确的判断类型的方法。

function getValueType(value) {
  var type = Object.prototype.toString.call(value)
  type = type.slice(8, -1)
  return type
}

console.log(getValueType(2))     //Number
console.log(getValueType("123"))  //String
console.log(getValueType(true))   //Boolean
console.log(getValueType(null))   //Null
console.log(getValueType(undefined))   //Undefined
console.log(getValueType({}))    //Object
console.log(getValueType([]))    //Array
console.log(getValueType(/\d/i))   //RegExp
console.log(getValueType(Math))   //Math
console.log(getValueType(new Date()))   //Date
console.log(getValueType(function f() {}))    //Function
console.log(getValueType(new Error()))    //Error

这种方法判断无疑更为准确,而且简单。


欢迎大家的指正,共同学习进步,谢谢。

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

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,233评论 0 4
  • 1、JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型(或基本数据类型)和复杂类...
    徐国军_plus阅读 469评论 0 1
  • 转载请声明出处 博客原文 随手翻阅以前的学习笔记,顺便整理一下放在这里,方便自己复习,也希望你有也有帮助吧 第一课...
    程序员poetry阅读 12,660评论 13 94
  • 不知道是否有人和我一样,总觉得生活不是那么真实,总觉得生活的剧本早已经写好,而我们不过是冥冥之中按照它的剧本进行...
    鹿维晴阅读 311评论 0 0
  • 1、死亡之下的罪恶 连夜读完东野圭吾的《濒死之眼》,被其惊悚罪恶深深震撼。在死亡的无可奈何之下,隐藏着人性的自私与...
    这只猫有点敏感阅读 45,708评论 9 7