在JS中如何判斷變量的類型屬于基礎(chǔ)知識(shí),很多時(shí)候我們會(huì)忽略金度。畢竟上手代碼的時(shí)候可以現(xiàn)查应媚。無論如何演變,我想基本功還是很重要的猜极,熟練掌握總是百利而無一害中姜。
1、首先第一種就是我們常用的typeof()魔吐,它會(huì)將類型信息當(dāng)作字符串返回扎筒。如下:
console.log(typeof undefined); //undefined
console.log(typeof 5); //number
console.log(typeof true); //boolean
console.log(typeof 'hello world!'); //string
很完美對(duì)不對(duì)?但我們知道酬姆,這個(gè)世界幾乎沒有什么是完美的“履纾看看下面的栗子就知道了:
console.log(typeof ['h', 'e', 'l', 'l', 'o']); //object
console.log(typeof { name: 'susu', age: 3 }); //object
console.log(typeof null); //object
console.log(typeof new Date()); //object
打印出來的結(jié)果都是object類型辞色。通過上面的打印結(jié)果,我們知道typeof在判斷變量類型的時(shí)候比較適合用來處理基本數(shù)據(jù)類型浮定,如果是引用類型的值相满,typeof恐怕就心有余而力不足了。
2桦卒、instanceof:該運(yùn)算符用來測(cè)試一個(gè)對(duì)象在其原型鏈中是否存在一個(gè)構(gòu)造函數(shù)的 prototype 屬性立美。
let arr = [1, 2, 3];
let obj = { name: 'susu', age: 3 };
console.log(obj instanceof Array); //false
console.log(obj instanceof Object); //true
通過instanceof很容易就能判斷一個(gè)變量是數(shù)組還是對(duì)象,貌似比typeof要高級(jí)了一些方灾。但如果遇到數(shù)組建蹄,情況可能跟我們想象的不一樣了碌更。
let arr = [1, 2, 3];
console.log(arr instanceof Array); //true
console.log(arr instanceof Object); //true
為什么都是true呢?看看上面instanceof運(yùn)算符的定義洞慎,是用來測(cè)試一個(gè)對(duì)象在原型鏈上是否存在一個(gè)構(gòu)造函數(shù)的prototype屬性痛单。只要熟悉原型鏈就會(huì)知道,每個(gè)對(duì)象都有一個(gè)proto屬性劲腿,指向創(chuàng)建該對(duì)象的函數(shù)的prototype旭绒。instanceof的判斷規(guī)則是通過proto和prototype能否找到同一個(gè)引用對(duì)象。通過打印下面的等式焦人,我們就能知道為什么上面的栗子都會(huì)打印出true挥吵。
console.log(arr.__proto__.__proto__ === Object.prototype); //true
console.log(arr.__proto__ === Array.prototype); //true
3、constructor:此屬性返回對(duì)創(chuàng)建此對(duì)象的數(shù)組函數(shù)的引用
let arr = [1, 2, 3];
let obj = { name: 'susu', age: 3 };
console.log(arr.constructor === Array); //true
console.log(arr.constructor === Object); //false
console.log(obj.constructor === Array); //false
console.log(obj.constructor === Object); //true
4花椭、Object.prototype.toString.call():在js中該方法可以精準(zhǔn)的判斷對(duì)象類型忽匈,也是推薦使用的方法。
可以判斷基本數(shù)據(jù)類型:
console.log(Object.prototype.toString.call(3)); //[object Number]
console.log(Object.prototype.toString.call(true)); //[object Boolean]
console.log(Object.prototype.toString.call(null)); //[object Null]
console.log(Object.prototype.toString.call('hello')); //[object String]
console.log(Object.prototype.toString.call(undefined)); //[object Undefined]
也可以判斷引用數(shù)據(jù)類型:
let arr = [1, 2, 3];
let obj = {name: 'susu', age: 3};
let date = new Date();
function fn(){console.log('hello world!')};
console.log(Object.prototype.toString.call(arr)); //[object Array]
console.log(Object.prototype.toString.call(obj)); //[object Object]
console.log(Object.prototype.toString.call(date)); //[object Date]
console.log(Object.prototype.toString.call(fn)); //[object Function]
以上个从。