JS的typeof和instanceof

JS的typeof和instanceof

typeof

typeof操作符返回一個字符串,表示未經計算的操作數的類型。

就這么幾種類型:number、boolean、string、object、undefined、function、symbol。

typeof 1 // "number"
typeof '1' // "string"
typeof true // "boolean"
typeof Symbol(1) // "symbol"
typeof {} // "object"
typeof [] // "object",
typeof function(){} // "function"
typeof Symbol(1) // "symbol"
typeof undefined // "undefined"
typeof null // "object",

instanceof

instanceof 運算符用來測試一個對象在其原型鏈中是否存在一個構造函數的 prototype 屬性。

涉及的構造函數有這些基礎類型:String、Number、Boolean、Undefined、Null、Symbol;

復雜類型:Array,Object;

其他類型:Function、RegExp、Date。

語法:[對象] instanceof [構造函數],如:

let obj = new Object()
obj instanceof Object // true

注意左側必須是對象(object),如果不是,直接返回false,具體見基礎類型。


基礎類型

let num = 1
num instanceof Number // false

num = new Number(1)
num instanceof Number // true

明明都是num,而且都是1,只是因為第一個不是對象,是基本類型,所以直接返回false,而第二個是封裝成對象,所以true。

這里要嚴格注意這個問題,有些說法是檢測目標的__proto__與構造函數的prototype相同即返回true,這是不嚴謹的,檢測的一定要是對象才行,如:

let num = 1
num.__proto__ === Number.prototype // true
num instanceof Number // false

num = new Number(1)
num.__proto__ === Number.prototype // true
num instanceof Number // true

num.__proto__ === (new Number(1)).__proto__ // true

上面例子可以看出,1與new Number(1)幾乎是一樣的,只是區(qū)別在于是否封裝成對象,所以instanceof的結果是不同的。

string、boolean等,這些基礎類型一樣的。

new String(1)與String(1)是不同的,new是封裝成對象,而沒有new的只是基礎類型轉換,還是基礎類型,如下:

new String(1) // String {"1"}
String(1) // "1"

其他基礎類型一樣的。

復雜類型,比如數組與對象,甚至函數等,與基礎類型不同。


復雜類型

let arr = []
arr instanceof Array // true
arr instanceof Object // true
Array.isArray(arr) // true

首先,字面量是直接生成構造函數的,所以不會像基本類型一樣兩種情況,這個可以放心用。

但是上面那個問題,當然,基礎類型也會有這個問題,就是與Object對比。沒辦法,Object在原型鏈的上層,所以都會返回true,如下:

(new Number(1)) instanceof Object // true

由于從下往上,比如你判斷是Number,那就沒必要判斷是不是Object了,因為已經是Number了……

Array一個道理,不過還是建議使用isArray來專門處理數組判斷。

new Object(){}就不介紹了,一樣的情況。


其他類型

let reg = new RegExp(//)
reg instanceof RegExp // true
reg instanceof Object // true

let date = new Date()
date instanceof Date // true
date instanceof Object // true

除了Function,都一樣,具體Function如下:

function A() {}
let a = new A()
a instanceof Function // false
a instanceof Object // true
A instanceof Function // true

這里要注意,function A() {}相當于let A; A = function() {},然后分析:

  1. a是new出來,所以是經過構造,因此已經是對象,不再是函數,所以false。
  2. a是經過構造的對象,返回ture沒問題。
  3. 如上所述,A是個函數,因此沒什么概念上的問題。但是要知道A.__proto__Function.prototype? () { [native code] },這是與object以后處于原型鏈上層的存在,而且與object平級,檢測如下:
let obj = {}
obj.__proto__ // {constructor: ?, __defineGetter__: ?, __defineSetter__: ?, hasOwnProperty: ?, __lookupGetter__: ?, …}
obj.__proto__.prototype // undefined

let A = function() {}
A.__proto__ // ? () { [native code] }
A.__proto__.prototype // undefined

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • ECMAScript關鍵字 delete do else finally function in instance...
    doudou2閱讀 768評論 0 0
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創(chuàng)建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,679評論 0 4
  • 概要 64學時 3.5學分 章節(jié)安排 電子商務網站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,851評論 0 3
  • JavaScript語言精粹 前言 約定:=> 表示參考相關文章或書籍; JS是JavaScript的縮寫。 本書...
    微笑的AK47閱讀 658評論 0 3
  • 月底了,時間過得就是很快,雖然業(yè)績和之前比差很多,但是感覺疫情期間我們干的也挺好的了,你若盛開、鮮花自來,服務好當...
    王佳歡雪閱讀 164評論 0 0

友情鏈接更多精彩內容