JavaScript:判斷對(duì)象類(lèi)型函數(shù)

typeof操作符

  • 是操作符,不是函數(shù),后面可以帶(),也可以不帶()
  • 返回的結(jié)果都是小寫(xiě)字母
  • 函數(shù)類(lèi)型返回function
  • 數(shù)組,null,等都返回object
  • 適合判斷基本類(lèi)型變量,不適合判斷引用類(lèi)型(都返回object),比如自定義的對(duì)象類(lèi)型
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"
  • 如果我們想要判斷一個(gè)變量是否存在,可以使用typeof,不能使用if(a)a未聲明,則報(bào)錯(cuò)。
if(typeof a != "undefined"){
    //變量存在
} else {
    //變量不存在
}

instanceof運(yùn)算符

instanceof運(yùn)算符用來(lái)判斷一個(gè)構(gòu)造函數(shù)的prototype屬性所指向的對(duì)象是否存在另外一個(gè)要檢測(cè)對(duì)象的原型鏈上

  • 返回的結(jié)果是一個(gè)布爾值true or false
  • 主要用于自定義對(duì)象的判斷
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用法區(qū)別
js中的instanceof運(yùn)算符

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

  • 返回的結(jié)果類(lèi)似“[object Null]”形式
  • 基本類(lèi)型和引用類(lèi)型都適用,比如,Array,Date
// 基本類(lèi)型
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]”
// 函數(shù)類(lèi)型
function fn(){console.log("test");}
Object.prototype.toString.call(fn);              // “[object Function]”
// 日期類(lèi)型
var date = new Date();
Object.prototype.toString.call(date);            // “[object Date]”
// 數(shù)組類(lèi)型
var arr = [1,2,3];
Object.prototype.toString.call(arr);             // “[object Array]”
// 正則表達(dá)式
var reg = /[hbc]at/gi;
Object.prototype.toString.call(reg);             // “[object RegExp]”
  • 自定義的類(lèi)型還是返回“[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]”
  • 通過(guò)對(duì)結(jié)果取自字符串,大小轉(zhuǎn)小寫(xiě)等操作,可以輸出"null"等結(jié)果
function type(object) {
   return Object.prototype.toString.call(object).slice(8,-1).toLowerCase();
}
type(1)              // "Number"
type("abc")          // "String"

關(guān)于Object.prototype.toString.call
Object.prototype.toString.call()方法淺談
js中通過(guò)Object.prototype.toString方法----精確判斷對(duì)象的類(lèi)型

判斷類(lèi)型工具

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

  • 獲取類(lèi)型字符串,全小寫(xiě)
  • 判斷是否是某種類(lèi)型的方便函數(shù)
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,
}

同時(shí),可以寫(xiě)一個(gè)測(cè)試文件,比如命名為type_test.js

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

// 基本類(lèi)型
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));

// 函數(shù)類(lèi)型
function fn() {
    console.log('test');
}
log(type.typeString(fn));
log(type.isFunction(fn));

// 日期類(lèi)型
var date = new Date();
log(type.typeString(date));
log(type.isDate(date));

// 數(shù)組類(lèi)型
var array = [1,2,3];
log(type.typeString(array));
log(type.isArray(array));

// 正則表達(dá)式
var reg = /[hbc]at/gi;
log(type.typeString(reg));
log(type.isRegExp(reg));

// 自定義類(lèi)型
function Person(name, age) {
    this.name = name;
    this.age = age;
}
var person = new Person("Rose", 18);
log(type.typeString(person));
log(type.isObject(person));
  • 如果只是導(dǎo)出一個(gè)函數(shù),獲取對(duì)象的類(lèi)型字符串,作為全局函數(shù)來(lái)使用,那么可以簡(jiǎn)單一點(diǎn)。
module.exports = function typeString(object) {
   return Object.prototype.toString.call(object).slice(8,-1).toLowerCase();
}

typeofJavaScript的操作符,所以這里函數(shù)取名有意避開(kāi),用了一個(gè)typeString。當(dāng)然,用其他名字也是可以的,比如直接type

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.通過(guò)typeof可以判斷處幾種基本數(shù)據(jù)類(lèi)型Boolean,number,string,null,undefin...
    舟漁行舟閱讀 687評(píng)論 0 1
  • 轉(zhuǎn)載請(qǐng)聲明出處 博客原文 隨手翻閱以前的學(xué)習(xí)筆記,順便整理一下放在這里,方便自己復(fù)習(xí),也希望你有也有幫助吧 第一課...
    前端進(jìn)階之旅閱讀 12,958評(píng)論 13 94
  • 到達(dá)目的地,在宿舍小息。簡(jiǎn)單安頓下來(lái),發(fā)現(xiàn)世界是如此平和。可內(nèi)心卻是不平靜,可以用外面的海來(lái)形容我的心情。首先,進(jìn)...
    奧特曼戰(zhàn)無(wú)不勝閱讀 259評(píng)論 0 0
  • 曾經(jīng)夜以繼日做過(guò)夢(mèng)不再記得,這幾日總是會(huì)夢(mèng)到過(guò)去一些事和人。在生命的長(zhǎng)河中,越來(lái)越明白一個(gè)人身邊的位置也就這么多,...
    朱小毛閱讀 223評(píng)論 0 0

友情鏈接更多精彩內(nèi)容