來源:前端全棧君丶 發(fā)布時間:2018-12-04 13:58:04 閱讀量:1184
在js中,有四種用于檢測數(shù)據(jù)類型的方式,分別是:
typeof 用來檢測數(shù)據(jù)類型的運算符
instanceof 檢測一個實例是否屬于某個類
constructor 構(gòu)造函數(shù)
Object.prototype.toString.call() 原型鏈上的Object對象的toString方法
下面我們就來分別介紹一下上面四種方法的適用場景和局限性。
typeof 用來檢測數(shù)據(jù)類型的運算符
使用typeof檢測數(shù)據(jù)類型,返回值是字符串格式。能夠返回的數(shù)據(jù)類型
是:“number”,“string”,“bolean”,“undefined”,“function”,“object”。
<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>
1
2
3
4
5
6
7
8
前端全棧學(xué)習(xí)交流圈:866109386,面向1-3經(jīng)驗?zāi)昵岸碎_發(fā)人員,幫助突破技術(shù)瓶頸,提升思維能力
群內(nèi)有大量PDF可供自取,更有干貨實戰(zhàn)項目視頻進群免費領(lǐng)取。
局限性:
不能用于檢測和處理字面量方式創(chuàng)建出來的基本數(shù)據(jù)類型值,即原始數(shù)據(jù)類型
instanceof的特性:只要在當(dāng)前實例的原型鏈上的對象,我們用其檢測出來都為true
在類的原型繼承中,我們最后檢測出來的結(jié)果未必正確
constructor 構(gòu)造函數(shù)
是函數(shù)原型上的屬性,該屬性指向的是構(gòu)造函數(shù)本身。
作用和instsnceof非常相似,與instanceof不同的是,不僅可以處理引用數(shù)據(jù)類型,還可以處理原始數(shù)據(jù)類型。
<script>
let num = 12;
let obj = {};
console.log(num.constructor == Number);//true
console.log(obj.constructor == Object);//true
</script>
1
2
3
4
5
6
但是要注意一點的是,當(dāng)直接用(對象字面量或原始數(shù)據(jù)).constructor時,最好加上()。為了便于理解,我們來看一個例子。
<script>
1.constructor === Number; //報錯,Invalid or unexceped token
(1).constructor === Number; //true
{}.constructor === Number; //報錯,Invalid or unexceped token
({}).constructor === Number; //true
</script>
1
2
3
4
5
6
前端全棧學(xué)習(xí)交流圈:866109386,面向1-3經(jīng)驗?zāi)昵岸碎_發(fā)人員,幫助突破技術(shù)瓶頸,提升思維能力
群內(nèi)有大量PDF可供自取,更有干貨實戰(zhàn)項目視頻進群免費領(lǐng)取。
這主要是由于js內(nèi)部解析方式造成的,js會把1.constructor解析成小數(shù),這顯然是不合理的,小數(shù)點后應(yīng)該是數(shù)字,因此就會引發(fā)報錯。js會把{}解析成語句塊來執(zhí)行,這時后面出現(xiàn)一個小數(shù)點顯然也是不合理的,因此也會報錯。為了解決這個問題,我們可以為表達式加上()使js能夠正確解析。
局限性:我們可以把類的原型進行重寫,在重寫的過程中很可能把之前constructor給覆蓋了,這樣檢測出來的結(jié)果就是不準(zhǔn)確的
<script>
function Fn() {};
Fn.prototype = new Array;
var f = new Fn;
//f是一個函數(shù),按道理說他的構(gòu)造函數(shù)應(yīng)該是Function,但是修改其原型鏈后,它的constructor變成了Array.
console.log(f.constructor == Array); //true
</script>
1
2
3
4
5
6
7
Object.prototype.toString.call() 原型鏈上的Object對象的toString方法
Object.prototype.toString的作用是返回當(dāng)前方法的執(zhí)行主體(方法中的this)所屬類的詳細信息,是最全面也是最常用的檢測數(shù)據(jù)類型的方式。
返回值的類型為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>
---------------------