檢測數據類型的方法有哪些?

數據類型包括:基本數據類型、引用數據類型。es6

基本數據類型:Null、undefined、String、Number、Boolean、Symbol面試

引用數據類型:Object、Array、Date、Function、Error、RegExp、Math、Number、String、Boolean、Globle正則表達式

判斷數據類型的方法主要有:typeof、intanceof、construtor、Object.prototype.toString.call( )、isArray(只能判斷是不是數組)數組

推薦使用Object.prototype.toString.call( )markdown


1、typeof (經常使用)

返回是一個字符串,經常使用於判斷基本數據類型:String、Number、Undefined、Boolean、Function,可是對象和Null和數組返回Object。函數

console.log(typeof '');//string
console.log(typeof 1);//number
console.log(typeof true);//boolean
console.log(typeof undefined);//undefined
console.log(typeof function () { });//function
console.log(typeof {});//object
console.log(typeof null);//object
console.log(typeof [1,2,3]);//object
複製代碼

判斷一個變量是否存在,可使用typeof:oop

注意不能使用if(a),若是a未聲明,會報錯:a is not defined。ui

if (typeof a != 'undefined') {
    console.log("a變量存在");
  } else {
    console.log("a變量不存在");
  }

//注意不能使用if(a),若是a未聲明,會報錯:a is not defined
 if (a) {
    console.log("1111");
  } else {
    console.log("222");
  }
複製代碼

2、instanceof

只適合用於檢測引用類型,而不能檢測基本的數據類型,返回的是一個布爾值。this

只要在原型鏈上有構造函數都會返回true,使用instanceof檢測不太準確。spa

instanceof的原理:

判斷構造函數的原型鏈(prototype)屬性是否出如今某實例的對象原型鏈上。

好比:A instanceof B 即B的prototype是否出如今A的原型鏈上。(A爲實例對象,B爲構造函數);

var arr = [];
console.log(arr);
console.log(arr instanceof Array);//true
console.log(arr instanceof Object);//true

let Person = function(){};
let p1 = new Person();
console.log(p1 instanceof Person);//true

let s1 = new String('leaf');
console.log(s1 instanceof String);//true

let str = "ice";
console.log(str instanceof String);//false
複製代碼

instanceof實現原理,能夠參考:

// 思路:順着原型查找,知道找到相同的原型對象,返回true 不然返回false
function myInstanceof(left, right) {
  // 使用typeof 判斷基礎數據類型
  if (typeof left !== 'object' || left === null) {
    return false;
  }
  // getPrototypeOf是Object對象自帶的API,獲取原型對象
  let proto = Object.getPrototypeOf(left);
  while (true) {
    if (proto === null) {
      return false;
    }
    // 找到相同原型對象,返回true
    if (proto === right.prototype) {
      return true
    }
    proto = Object.getPrototypeOf(proto);
  }
}
複製代碼

3、constructor(慎用!)

constructor這個屬性存在構造函數的原型鏈上的屬性,指向構造函數,能夠經過直接訪問查看構造函數上的__proto__直接查看所屬類型。

var arr = [];
console.log(arr);
console.log(arr.constructor === Array);
複製代碼

由於原型鏈的屬性是能夠修改的,constructor會有被修改的可能,因此不建議使用該方法:

function Person(){

}

Person.prototype = new Array();//修改Person構造函數上原型鏈

var myFather = new Person();
console.log(Person.constructor === Array);//false
複製代碼

4、Object.prototype.toString.call( ) (推薦!!!)

返回一個「[object XXX]」格式的字符串,XXX就是具體的數據類型,包括:String,Number,Boolean,Undefined,Null,Function,Date,Array,RegExp,Error,HTMLDocument等。

toString是Object原型對象上的一個方法,該方法默認返回其調用者的具體類型,嚴格來講,是toString運行時this指向的對象類型,返回的類型。

let myNull = null;
console.log(Object.prototype.toString.call(myNull));//[object Null]

let myUndefined = undefined;
console.log(Object.prototype.toString.call(myUndefined));//[object Undefined]

let str = 'leaf';
console.log(Object.prototype.toString.call(str));//[object String]

let arr = [];
console.log(Object.prototype.toString.call(arr));//[object Array]

let boolean = true;
console.log(Object.prototype.toString.call(boolean));//[object Boolean]

let myDate = new Date();
console.log(Object.prototype.toString.call(myDate));//[object Date]

let myFun = function (){};
console.log(Object.prototype.toString.call(myFun));//[object Function]

let myError = new Error();
console.log(Object.prototype.toString.call(myError));//[object Error]

let myReg = /leaf/;
console.log(Object.prototype.toString.call(myReg));//[object RegExp]
複製代碼

最簡單的判斷是數組的方法,記住嘍是object.prototype.toString.call()

5、isArray方法(只能判斷數組)

isArray() 方法用於判斷一個對象是否爲數組。 若是對象是數組返回 true,不然返回 false。

const a = [];
const b = {};
Array.isArray(a);//true
Array.isArray(b);//false
複製代碼

6、相關面試題

實現一個全局通用的數據類型的判斷方法

function getType(obj) {
  if (typeof obj !== 'object') {
    return (typeof obj)
  }
  return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1');
}

console.log(getType([]));//Array
console.log(getType(null));//Null
console.log(getType('123'));//string

正則複習:
// ^ 匹配的開始
// $ 匹配輸入的結束
// * 匹配前一個表達式0次或屢次
// \s 匹配一個空白字符,包括空格、製表符、換頁符、換行符等
// 正則表達式後的"g"是一個表示全局搜索選項或標記,將在整個字符串查找並返回全部匹配結果

複製代碼

如何判斷一個數組?

判斷數組的幾種方法:

  • instanceof
  • 使用Array對象的isArray方法判斷
  • Object.prototype.toString.call( )

一、instanceof

if (arr instanceof Array === false) {
   console.log("非數組");
   return false
}
return true
複製代碼

二、使用Array對象的isArray方法判斷

isArray() 方法用於判斷一個對象是否爲數組。

若是對象是數組返回 true,不然返回 false。

const a = [];
const b = {};
Array.isArray(a);//true
Array.isArray(b);//false
複製代碼

三、Object.prototype.toString.call( )

let arr = [];
if(Object.prototype.toString.call(arr) === "[object Array]"){
   console.log("我是數組");
  return true
}
console.log("我不是數組");
return false
複製代碼

如何判斷一個空對象?

判斷空對象的幾種方法:

  • for...in遍歷對象屬性

  • 使用JSON.stringify

  • Object.keys( )

一、for...in遍歷對象屬性

let obj = {};

for (var i in obj) {// 若是不爲空對象,會執行到這裏,返回true
  return true
}
return false//若是空對象,返回false
}
複製代碼

二、使用JSON.stringify

let obj = {};

if (JSON.stringify(obj) === "{}") {
   return false
 }
return true //非空對象,返回true
複製代碼

三、Object.keys( )

ES5 引入了Object.keys方法,返回一個數組,成員是參數對象自身的(不含繼承的)全部可遍歷(enumerable)屬性的鍵名。

let obj = {};
console.log(Object.keys(obj));//[]

var obj = { foo: 'bar', baz: 42 };
console.log(Object.keys(obj));//["foo", "baz"]
複製代碼

能夠經過判斷返回數據的長度來知道它是否爲空:

let obj = {};

if (Object.keys(obj).length === 0) {
  console.log("空對象");
  return false
}
return true
複製代碼

複習Object.keys( )的用法:

es6新增對象方法Object.keys.png

參考資料:

相關文章
相關標籤/搜索