JavaScript 里面的 instanceof 解析


  一般我們判斷某個變量是什么類型的常常會用 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會更好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM