1. 程式人生 > 程式設計 >toString.call()通用的判斷資料型別方法示例

toString.call()通用的判斷資料型別方法示例

大家都知道判斷資料型別的方法有很多。我們常用的有typeof但是,這個方法有一定的侷限性。

typeof null
// "object"
 
typeof [8]
// "object"
 
typeof {}
// "object"
 
typeof function(){}
// "function"
typeof 2
//"number"
 
typeof ""
//"string"
 
typeof true
//"boolean"
 
typeof undefined
//"undefined"
 
typeof Symbol(2)
// "symbol"

typeof 無法區分null 陣列和物件,通常我們會區分判斷Array和Object

有時會用instanceof 來判斷是不是一個物件的例項子

[] instanceof Array
 // true 這種方法可以判斷陣列,不能區分物件
[] instanceof Object
// true
 
null instanceof Object
// false 也不能區分null

下面介紹一種方法,對每一種資料型別都實用。

toString.call(function(){})
// "[object Function]"
 
toString.call(null)
//"[object Null]"
 
toString.call([2])
"[object Array]"
 
toString.call(undefined)
//"[object Undefined]"
 
toString.call('stjd')
//"[object String]"
 
toString.call(1)
//"[object Number]"
 
toString.call(true)
//"[object Boolean]"
 
toString.call(Symbol(3))
// "[object Symbol]"
 
toString.call({q:8})
//"[object Object]"

再來思考,toString.call([2]) 意思就是改變方法中的this指向,指向傳遞進去的引數,也就是[2]。那我這樣寫不是更直觀嗎?[2].toString()。結果

[2].toString()
//"2"
  var obj = {a: 67}
  console.log(obj.toString())
  // [object Array]

對比上面兩個返回的值是不一樣的。這是因為[2].toString()呼叫的是陣列的toSting()方法,而不是物件的toSting()方法。Array改寫了Object的toString方法。

toSting.call()實際上就是 Object.prototype.toSting.call()

console.log(Object.prototype.toString.call([33])) // [object Array]

而[2].toSting()實際上是

console.log(Array.prototype.toString.call([2])) //2

使用的過程中,可以這樣封裝函式

  function isType(type) {
   return function(obj) {
    return {}.toString.call(obj) == "[object " + type + "]"
   }
  }
  
  var isObject = isType("Object")
  var isString = isType("String")
  var isArray = Array.isArray || isType("Array")
  var isFunction = isType("Function")
  var isUndefined = isType("Undefined")

總結

到此這篇關於toString.call()通用的判斷資料型別方法的文章就介紹到這了,更多相關toString.call()判斷資料型別內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!