1. 程式人生 > >javascript-理解toString方法的巧妙之處

javascript-理解toString方法的巧妙之處

toString方法的妙處


toString方法是javascript的原生方法,每一種資料型別從Object繼承了該方法,今天來說說toString方法的巧妙之處。

判斷資料型別

日常開發時,經常需用到判斷資料型別的時候,通常用到typeof或者instanceof這2個關鍵字。typeof將資料型別轉成字串表示,缺點是無法區分null和object型別。而且,instanceof將變數的建構函式與javascript提供的原生建構函式比較,返回布林值,缺點是隻能判斷引用型別,且無法區分函式和物件。此時,就該toString方法大顯神威了。

function isNumber(obj){
	return toString.call(obj) === '[object Number]'
}

上面的寫法看似沒錯,卻存在一個隱藏的bug!
在這裡插入圖片描述
toString()方法是window物件的全域性屬性,而該屬性是可以修改的,故存在出錯的可能。若toString()方法未被重新賦值,在Chrome瀏覽器中不會報錯,而IE11瀏覽器直接報錯!
在這裡插入圖片描述
故上述方法需要改動。

function isNumber(obj){
	return Object.prototype.toString.call(obj) === '[object Number]'
}

在這裡插入圖片描述
巧妙之處就是借用Object原型上的toString()方法,已知Object原型上的方法是無法修改的,故IE11瀏覽器就沒報錯了。

花樣繁多的型別判斷

方式一(原型的toString方法)

const types = ['Arguments', 'Function', 'Array', 'Object', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet']
const fns = {}
types.forEach(v => {
  fns[
`is${v}`] = obj => { return Object.prototype.toString.call(obj) === `[object ${v}]` } }) export default { ...fns }

方式二(es6提供的Reflect方法!推薦使用)

const types = ['Arguments', 'Function', 'Array', 'Object', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet']
const fns = {}
types.forEach(v => {
  fns[`is${v}`] = obj => {
    return Reflect.apply(Object.prototype.toString, obj, []) === `[object ${v}]`
  }
})

export default {
  ...fns
}

總結

對toString()方法和判斷資料型別的使用方式的一些淺顯看法,如果不正之處,請指出,Thanks♪(・ω・)ノ。