1. 程式人生 > >詳解數據類型檢測的四種方式

詳解數據類型檢測的四種方式

ava ref ack prop 它的 per 固定 log ons

目錄

  • 詳解數據類型檢測的四種方式
    • typeof:用來檢測數據類型的運算符
    • instanceof:檢測某一個實例是否屬於某個類
    • constructor:構造函數
      • 註意:對於特殊的數據類型,比如:null和undefined,他們的所屬類是Null和Undefined,但是瀏覽器把這兩個類保護起來了,不允許在外面訪問使用
    • Object.prototype.toString.call():最準確最常用的方式
      • 對toString的理解

詳解數據類型檢測的四種方式

typeof:用來檢測數據類型的運算符

console.log(typeof 12);
var name = ‘xiaoke‘;
console.log(typeof name);

使用typeof檢測數據類型,首先返回的都是一個字符串,其次字符串中包含了對應的數據類型

  • 例如:"number"、"string"、"boolean"、"undefined"、"function"、"object"、""

局限性: typeof null->"object"

  • 不能具體細分是數組還是正則,還是對象中其他的值,因為使用type哦對檢測數據類型,對於對象數據類型中的值,最後返回的結果都是"object"
console.log(typeof typeof typeoof function());//->"string"

function fn(callback){
    //typeof callback === "function"?callback:null;
    callback&&callback();
}
fn(function(){});

instanceof:檢測某一個實例是否屬於某個類

var obj = [12,23];
console.log(obj instanceof Array);//true
console.log(obj instanceof RegExp);//false

局限性:

  • 在類的原型繼承中,我們最後檢測出來的結果不一定正確

在原型被修改之後都可能不正確

console.log(1 instanceof Number);//false
console.log("" instanceof String);//false
var ary = [];
console.log(ary instanceof Array);//true
function fn(){}
var ary = new Array;
fn.prototype = new Array;//->原型繼承;讓子類的原型等於父類的一個實例
var f = new fn;
f.__proto__ = fn.prototype=ary.__proto__=Array.prototype;
fn.prototype->Array.prototype->Object.prototype
console.log(f instanceof Array);//true

constructor:構造函數

作用和instanceof非常相似

  • 可以處理基本數據類型的檢測
  • constructor檢測Object和instanceof不一樣,一般情況下是檢測不了的

局限性:

  • 我們可以把類的原型進行重寫,在重寫的過程中很有可能出現之前的constructor給覆蓋了,這樣檢測出來的結果就是不正確的
var num = 1;
console.log(num.constructor ===Number);//
var reg = /^$/;
console.log(reg.constructor===RegExp);//true
console.log(reg.constructor===Object);//false

function Fn(){}
Fn.protoype = new Array;
var f = new Fn;
console.log(f.constructor);//Array

註意:對於特殊的數據類型,比如:null和undefined,他們的所屬類是Null和Undefined,但是瀏覽器把這兩個類保護起來了,不允許在外面訪問使用

Object.prototype.toString.call():最準確最常用的方式

什麽叫Object?

  • Object是內置類、是所有對象的基類、Object是引用數據類型
  • 首先獲取Object原型上的toString方法,讓方法執行,並且改變方法中的this關鍵字
  • 作用:Object.prototype.toString它的作用是返回當前方法的執行主體(方法中的this)所屬類的詳細信息,[object Object],第一個object代表當前實例是對象數據類型(這個是固定死的),第二個Object代表的是obj所屬類是Object
var obj = {};
console.log(obj.toString());//->toString中的this是誰?->obj,返回的是obj所屬類的信息->"[object Object]" 

對toString的理解

咋一看應該是轉換為字符串,但是某些toString方法不僅僅是轉換為字符串
對於Number、String、Boolean、Array、RegExp、Date、Function原型上的toString方法都是把當前的數據類型轉換為字符串類型的(它們的作用僅僅是用來轉換為字符串的)

  • Number.prototype.toString()是用來轉換為字符串的,如果toString()的參數為一個,可以轉換為各種進制的數字

console.log(({}).toString());//[object Object]

  • 字符串的原型上的toString()也是用來轉換為字符串的,進制轉換不管用
console.log((1).toString());//Number.prototype.toString()轉換為字符串
console.log((true).toString());//"true"
console.log((null).toString());//Cannot read property‘‘toString‘ of null
console.log((undefined).toString());//Cannot read property‘‘toString‘ of undefined
console.log(({}).toString());//[object Object]

詳解數據類型檢測的四種方式