如何判斷變數型別

xuerensusu發表於2018-05-10

在JS中如何判斷變數的型別屬於基礎知識,很多時候我們會忽略。畢竟上手程式碼的時候可以現查。無論如何演變,我想基本功還是很重要的,熟練掌握總是百利而無一害。

1、首先第一種就是我們常用的typeof(),它會將型別資訊當作字串返回。如下:

console.log(typeof undefined); //undefined
console.log(typeof 5); //number
console.log(typeof true); //boolean
console.log(typeof 'hello world!'); //string複製程式碼

很完美對不對?但我們知道,這個世界幾乎沒有什麼是完美的。看看下面的栗子就知道了:

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複製程式碼

列印出來的結果都是object型別。通過上面的列印結果,我們知道typeof在判斷變數型別的時候比較適合用來處理基本資料型別,如果是引用型別的值,typeof恐怕就心有餘而力不足了。

2、instanceof:該運算子用來測試一個物件在其原型鏈中是否存在一個建構函式的 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很容易就能判斷一個變數是陣列還是物件,貌似比typeof要高階了一些。但如果遇到陣列,情況可能跟我們想象的不一樣了。

let arr = [1, 2, 3];
console.log(arr instanceof Array); //true
console.log(arr instanceof Object); //true複製程式碼

為什麼都是true呢?看看上面instanceof運算子的定義,是用來測試一個物件在原型鏈上是否存在一個建構函式的prototype屬性。只要熟悉原型鏈就會知道,每個物件都有一個__proto__屬性,指向建立該物件的函式的prototype。instanceof的判斷規則是通過__proto__和prototype能否找到同一個引用物件。通過列印下面的等式,我們就能知道為什麼上面的栗子都會列印出true。

console.log(arr.__proto__.__proto__ === Object.prototype); //true
console.log(arr.__proto__ === Array.prototype); //true複製程式碼

3、constructor:此屬性返回對建立此物件的陣列函式的引用

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中該方法可以精準的判斷物件型別,也是推薦使用的方法。

可以判斷基本資料型別:

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]複製程式碼

也可以判斷引用資料型別:

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]複製程式碼

以上。


相關文章