您好,登錄后才能下訂單哦!
在js中,有四種用于檢測數據類型的方式,分別是:
下面我們就來分別介紹一下上面四種方法的適用場景和局限性。
typeof 用來檢測數據類型的運算符
使用typeof檢測數據類型,返回值是字符串格式。能夠返回的數據類型
是:"number","string","bolean","undefined","function","object"。
<script> console.log(typeof(1)); //number console.log(typeof('hello')); //string console.log(typeof(true)); //boolean console.log(typeof(undefined)); //undefined console.log(typeof(null)); //object console.log(typeof({})); //object console.log(typeof(function() {})); //function </script>
局限性:
instanceof 檢測某一個實例是否屬于某個類
instanceof主要用來彌補typeof不能檢測具體屬于哪個對象的局限性。
<script> let arr = [1,2,3]; let reg = /\w/; console.log(arr instanceof Array); //true console.log(arr instanceof Object); //true console.log(reg instanceof RegExp); //true console.log(reg instanceof Object); //true </script>
局限性:
constructor 構造函數
是函數原型上的屬性,該屬性指向的是構造函數本身。
作用和instsnceof非常相似,與instanceof不同的是,不僅可以處理引用數據類型,還可以處理原始數據類型。
<script> let num = 12; let obj = {}; console.log(num.constructor == Number);//true console.log(obj.constructor == Object);//true </script>
但是要注意一點的是,當直接用(對象字面量或原始數據).constructor時,最好加上()。為了便于理解,我們來看一個例子。
<script> 1.constructor === Number; //報錯,Invalid or unexceped token (1).constructor === Number; //true {}.constructor === Number; //報錯,Invalid or unexceped token ({}).constructor === Number; //true </script>
這主要是由于js內部解析方式造成的,js會把1.constructor解析成小數,這顯然是不合理的,小數點后應該是數字,因此就會引發報錯。js會把{}解析成語句塊來執行,這時后面出現一個小數點顯然也是不合理的,因此也會報錯。為了解決這個問題,我們可以為表達式加上()使js能夠正確解析。
局限性:我們可以把類的原型進行重寫,在重寫的過程中很可能把之前constructor給覆蓋了,這樣檢測出來的結果就是不準確的
<script> function Fn() {}; Fn.prototype = new Array; var f = new Fn; //f是一個函數,按道理說他的構造函數應該是Function,但是修改其原型鏈后,它的constructor變成了Array. console.log(f.constructor == Array); //true </script>
Object.prototype.toString.call() 原型鏈上的Object對象的toString方法
Object.prototype.toString的作用是返回當前方法的執行主體(方法中的this)所屬類的詳細信息,是最全面也是最常用的檢測數據類型的方式。
返回值的類型為string類型。
<script> console.log(Object.prototype.toString.call(1)); //[object Number] console.log(Object.prototype.toString.call(/^sf/)); //[object RegExp] console.log(Object.prototype.toString.call("hello")); //[object String] console.log(Object.prototype.toString.call(true)); //[object Boolean] console.log(Object.prototype.toString.call(null)); //[object Null] console.log(Object.prototype.toString.call(undefined)); //[object Undefined] console.log(Object.prototype.toString.call(function() {})); //[object Function] console.log(typeof(Object.prototype.toString.call(function() {}))); //string </script>
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。