JavaScript:判断对象类型函数

typeof操作符

  • 是操作符,不是函数,后面可以带(),也可以不带()
  • 返回的结果都是小写字母
  • 函数类型返回function
  • 数组,null,等都返回object
  • 适合判断基本类型变量,不适合判断引用类型(都返回object),比如自定义的对象类型
var message = "some string";
typeof message;      // "string"
typeof (message) ;   // "string"

typeof null;           // "object"
typeof Array;          // "function"
typeof [1, 2, 333];    // "object"
typeof undefined;      // "undefined"
typeof 100;            // "number"
typeof false;          // "boolean"
typeof {a: 1};         // "boolean"
  • 如果我们想要判断一个变量是否存在,可以使用typeof,不能使用if(a)a未声明,则报错。
if(typeof a != "undefined"){
    //变量存在
} else {
    //变量不存在
}

instanceof运算符

instanceof运算符用来判断一个构造函数的prototype属性所指向的对象是否存在另外一个要检测对象的原型链上

  • 返回的结果是一个布尔值true or false
  • 主要用于自定义对象的判断
function Person(){};
function Student(){};
var p = new Person();
Student.prototype = p;               //继承原型
var s = new Student();
console.log(s instanceof Student);   //true
console.log(s instanceof Person);    //true

js中typeof和instanceof用法区别
js中的instanceof运算符

Object.prototype.toString.call(object) 方法

  • 返回的结果类似“[object Null]”形式
  • 基本类型和引用类型都适用,比如,Array,Date
// 基本类型
Object.prototype.toString.call(null);          // “[object Null]”
Object.prototype.toString.call(undefined);     // “[object Undefined]”
Object.prototype.toString.call("abc");         // “[object String]”
Object.prototype.toString.call(123);           // “[object Number]”
Object.prototype.toString.call(true);          // “[object Boolean]”
// 函数类型
function fn(){console.log("test");}
Object.prototype.toString.call(fn);              // “[object Function]”
// 日期类型
var date = new Date();
Object.prototype.toString.call(date);            // “[object Date]”
// 数组类型
var arr = [1,2,3];
Object.prototype.toString.call(arr);             // “[object Array]”
// 正则表达式
var reg = /[hbc]at/gi;
Object.prototype.toString.call(reg);             // “[object RegExp]”
  • 自定义的类型还是返回“[object Object]”
function Person(name, age) {
    this.name = name;
    this.age = age;
}
var person = new Person("Rose", 18);
Object.prototype.toString.call(person); //“[object Object]”
  • 通过对结果取自字符串,大小转小写等操作,可以输出"null"等结果
function type(object) {
   return Object.prototype.toString.call(object).slice(8,-1).toLowerCase();
}
type(1)              // "Number"
type("abc")          // "String"

关于Object.prototype.toString.call
Object.prototype.toString.call()方法浅谈
js中通过Object.prototype.toString方法----精确判断对象的类型

判断类型工具

比如文件名可以命名为type.js

  • 获取类型字符串,全小写
  • 判断是否是某种类型的方便函数
function typeString(object) {
   return Object.prototype.toString.call(object).slice(8,-1).toLowerCase();
}

function isNull(object) {
    return typeString(object) === 'null';
}

function isUndefined(object) {
    return typeString(object) === 'undefined';
}

function isNumber(object) {
    return typeString(object) === 'number';
}

function isString(object) {
    return typeString(object) === 'string';
}

function isBoolean(object) {
    return typeString(object) === 'boolean';
}

function isFunction(object) {
    return typeString(object) === 'function';
}

function isArray(object) {
    return typeString(object) === 'array';
}

function isDate(object) {
    return typeString(object) === 'date';
}

function isRegExp(object) {
    return typeString(object) === 'regexp';
}

function isObject(object) {
    return typeString(object) === 'object';
}

module.exports = {
    typeString : typeString,
    isNull : isNull,
    isUndefined : isUndefined,
    isNumber : isNumber,
    isString : isString,
    isBoolean : isBoolean,
    isFunction : isFunction,
    isArray : isArray,
    isDate : isDate,
    isRegExp : isRegExp,
    isObject : isObject,
}

同时,可以写一个测试文件,比如命名为type_test.js

const type = require('./type.js')
const log = console.log;

// 基本类型
log(type.typeString(123));
log(type.isNumber(123));
log(type.typeString(null));
log(type.isNull(null));
log(type.typeString(undefined));
log(type.isUndefined(undefined));
log(type.typeString(`123`));
log(type.isString('123'));
log(type.typeString(true));
log(type.isBoolean(true));

// 函数类型
function fn() {
    console.log('test');
}
log(type.typeString(fn));
log(type.isFunction(fn));

// 日期类型
var date = new Date();
log(type.typeString(date));
log(type.isDate(date));

// 数组类型
var array = [1,2,3];
log(type.typeString(array));
log(type.isArray(array));

// 正则表达式
var reg = /[hbc]at/gi;
log(type.typeString(reg));
log(type.isRegExp(reg));

// 自定义类型
function Person(name, age) {
    this.name = name;
    this.age = age;
}
var person = new Person("Rose", 18);
log(type.typeString(person));
log(type.isObject(person));
  • 如果只是导出一个函数,获取对象的类型字符串,作为全局函数来使用,那么可以简单一点。
module.exports = function typeString(object) {
   return Object.prototype.toString.call(object).slice(8,-1).toLowerCase();
}

typeofJavaScript的操作符,所以这里函数取名有意避开,用了一个typeString。当然,用其他名字也是可以的,比如直接type

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

推荐阅读更多精彩内容

  • 1.通过typeof可以判断处几种基本数据类型Boolean,number,string,null,undefin...
    舟渔行舟阅读 642评论 0 1
  • 转载请声明出处 博客原文 随手翻阅以前的学习笔记,顺便整理一下放在这里,方便自己复习,也希望你有也有帮助吧 第一课...
    程序员poetry阅读 12,655评论 13 94
  • 到达目的地,在宿舍小息。简单安顿下来,发现世界是如此平和。可内心却是不平静,可以用外面的海来形容我的心情。首先,进...
    奥特曼战无不胜阅读 224评论 0 0
  • 曾经夜以继日做过梦不再记得,这几日总是会梦到过去一些事和人。在生命的长河中,越来越明白一个人身边的位置也就这么多,...
    朱小毛阅读 190评论 0 0