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();
}
typeof是JavaScript的操作符,所以這里函數(shù)取名有意避開(kāi),用了一個(gè)typeString。當(dāng)然,用其他名字也是可以的,比如直接type