一般我們判斷某個變量是什么類型的常常會用 typeof 運算符,但是你們發現沒有,不管引用的是什么類型的對象,它都返回的是 object 類型的。其實有的時候我們很想看看這個對象是什么具體的類型,所以在JS里面引入了 instanceof 運算符。instanceof運算符跟typeof運算符很相似,都是用來查看類型。
我們先說一下 typeof 和 instanceof 的語法:
對於 typeof : typeof option
option 是需要檢測的對象,也可以是一個表達式,以字符串的形式返回 option 的類型。
對於 instanceof : option instanceof constructor
option 是需要檢測的對象,constructor 是你確定的對象,返回的是這個option是否屬於constructor這個類型的布爾值。看一個簡單的例子:
function Student() { } var studentA = new Student(); console.info(studentA instanceof Student) //true console.info(typeof studentA) //'object' console.info(typeof {k:1}) //'object' console.info(typeof 300) //'Number' console.info(typeof 'hello world') //'string' console.info(typeof a!='undefind') //true
發現沒有?雖然instanceof可能沒有 typeof 那么好用,那么容易想到用,而且還可以用typeof來判斷一個變量是否存在而不用if判斷,但是instanceof必須要知道對比的那個類型(這里是constructor)。但是在對於typeof 一個對象的時候(也就是返回值為object的時候),instanceof 所體現的好處還是很大的。比如在繼承當中可以明顯看到優點:
function Person() { } Student.prototype = Object.create(Person); Student.prototype.constructor = Student; console.info(studentA instanceof Student) //true console.info(studentA instanceof Person) //false
本文主要講instanceof ,對於typeof就不再過多講解。通常情況下,我們使用 instanceof 就是為了判斷某個實例是否屬於某種類型。例如上面的:
studentA instanceof Student //判斷studentA 是否屬於Student類型的
書上曾經這么說的:instanceof
運算符可以用來判斷某個構造函數的prototype屬性是否存在另外一個要檢測對象的原型鏈上。也就是說用來判斷
constructor.prototype
是否存在於參數option
的原型鏈上(對於JS里面的原型鏈,我這里就不講解)。再看一個例子:
function My(){} function You(){} var myOne = new My(); console.info(myOne instanceof My)//true console.info(myOne instanceof You)//false My.prototype = {}; //修改了My.prototype var myTwo = new My(); console.info(myTwo instanceof My)//true console.info(myOne instanceof My)//false,My.prototype指向了空 You.prototype = new My(); //修改了Your.prototype var myThree = new You(); console.info(myThree instanceof You)//true console.info(myThree instanceof My)//true
當在繼承的這種情況下的時候或者要判斷實例的類型的時候,明顯使用instanceof會比typeof會更好。