1. 程式人生 > >判斷JS資料型別的四種方法

判斷JS資料型別的四種方法

說到資料型別,我們先說一下JavaScript 中常見的幾種資料型別:

基本型別:string,number,boolean

特殊型別:undefined,null

引用型別:Object,Function,Function,Array,RegExp,Date,...

很多時候我們都需要通過判斷變數的資料型別來進行下一步操作,下面我們介紹常用的4種方法:

1、typeof

typeof 返回一個表示資料型別的字串,返回結果包括:number、boolean、string、object、undefined、function等6種資料型別。

1 2 3 4 5 6 7 8 9 typeof ''// string 有效 typeof 1; // number 有效 typeof true//boolean 有效 typeof undefined; //undefined 有效 typeof null//object 無效 typeof [] ; //object 無效 typeof new Function(); // function 有效 typeof new Date(); //object 無效 typeof new RegExp(); //object 無效

typeof 可以對JS基礎資料型別做出準確的判斷,而對於引用型別返回的基本上都是object, 其實返回object也沒有錯,因為所有物件的原型鏈最終都指向了Object,Object是所有物件的`祖宗`。 但當我們需要知道某個物件的具體型別時,typeof 就顯得有些力不從心了。

2、instanceof

instanceof 是用來判斷 A 是否為 B 的例項對,表示式為:A instanceof B,如果A是B的例項,則返回true,否則返回false。 在這裡需要特別注意的是:instanceof檢測的是原型,我們用一段虛擬碼來模擬其內部執行過程:

1 2 3 4 5 6 7 8 9 instanceof (A,B) = { var L = A.__proto__; var R = B.prototype; if(L === R) { //A的內部屬性__proto__指向B的原型物件 return true;
} return false; }

從上述過程可以看出,當 A 的 __proto__ 指向 B 的 prototype 時,就認為A就是B的例項,我們再來看幾個例子:

1 2 3 4 5 6 7 8 9 10 [] instanceof Array; //true {} instanceof Object;//true new Date() instanceof Date;//true function Person(){}; new Person() instanceof Person; [] instanceof Object; //true new Date() instanceof Object;//true new Person instanceof Object;//true

我們發現,雖然 instanceof 能夠判斷出 [] 是Array的例項,但它認為 [] 也是Object的例項,為什麼呢? 我們來分析一下[]、Array、Object 三者之間的關係: 從instanceof 能夠判斷出 [].__proto__ 指向 Array.prototype, 而 Array.prototype.__proto__ 又指向了Object.prototype,Object.prototype.__proto__ 指向了null,標誌著原型鏈的結束。因此,[]、Array、Object就形成了如下圖所示的一條原型鏈:

從原型鏈可以看出,[] 的 __proto__  直接指向Array.prototype, 間接指向Object.prototype, 所以按照 instanceof 的判斷規則,[] 就是Object的例項。當然,類似的new Date()、new Person() 也會形成這樣一條原型鏈,因此,instanceof 只能用來判斷兩個物件是否屬於原型鏈的關係, 而不能獲取物件的具體型別。

3、constructor

當一個函式F被定義時,JS引擎會為F新增prototype原型,然後再在prototype上新增一個constructor屬性,並讓其指向F的引用。如下所示:

當執行 var f = new F() 時,F被當成了建構函式,f是F的例項物件,此時F原型上的constructor傳遞到了f上,因此f.constructor == F

可以看出,JS在函式F的原型上定義了constructor,當F被當作建構函式用來建立物件時,建立的新物件就被標記為了“F” 型別,使得新物件有名有姓,可以追溯。

同理,JS中的資料型別也遵守這個規則:

細節問題:

  • null和undefined是無效的物件,因此是不會有constructor存在的,這兩種型別的資料需要通過typeof來判斷。
  • JS物件的constructor是不穩定的,這個主要體現在自定義物件上,當開發者重寫prototype後,原有的constructor會丟失,constructor會預設為Object

為什麼變成了Object?

prototype被重新賦值的是一個{}, {}是new Object()的字面量,因此new Object()會將Object原型上的constructor傳遞給{},也就是Object本身。

因此,為了規範,在重寫物件原型時一般都需要重新給constructor賦值,以保證例項物件的型別不被改寫。

4、Object.prototype.toString 

toString是Object原型物件上的一個方法,該方法預設返回其呼叫者的具體型別,更嚴格的講,是 toString執行時this指向的物件型別, 返回的型別格式為[object,xxx],xxx是具體的資料型別,其中包括:String,Number,Boolean,Undefined,Null,Function,Date,Array,RegExp,Error,HTMLDocument,... 基本上所有物件的型別都可以通過這個方法獲取到。 

1 2 3 4 5 6 7 8 9 10 11 12 Object.prototype.toString.call('') ;   // [object String]

相關推薦

判斷JS資料型別方法

說到資料型別,我們先說一下JavaScript 中常見的幾種資料型別: 基本型別:string,number,boolean 特殊型別:undefined,null 引用型別:Object,Function,Function,Array,RegExp,Date,... 很多時候我們都需要通過判斷變

js檢測資料型別辦法

1.typeof   1 console.log(typeof ""); 2 console.log(typeof 1); 3 console.log(typeof true); 4 console.log(typeof null); 5 console.log(typeof un

SpringMVC獲取前端資料方法

在獲取資料之前先說下註解,註解的功能大家都知道,不再多說,這裡說下如何使用  首先,我們需要在springmvc-servlet.xml檔案中新增 <!--開啟註解掃描功能--> <mvc:annotation-driven/>

webservice 返回資料方法

  在使用WebService進行遠端資料操作時,細心的你會發現WebServices的效能特別的慢,當然也曾聽見很多網友也如此如何如何。說實話,WebServices的確比呼叫本地資料要慢一些,可究竟有多慢?真的如網友們說的那麼難以忍受嗎?我個人感覺,多半原因在處理的方式上。讓我們親自編

Hive匯入資料方法

Hive的幾種常見的資料匯入方式這裡介紹四種:(1)、從本地檔案系統中匯入資料到Hive表;(2)、從HDFS上匯入資料到Hive表;(3)、從別的表中查詢出相應的資料並匯入到Hive表中;(4)、在建立表的時候通過從別的表中查詢出相應的記錄並插入到所建立的表中。 一、從本地檔案系統中匯入資料到Hive表

js資料型別及檢測方法

###一、資料型別檢測方法 在js中,有四種用於檢測資料型別的方式,分別是: typeof  用來檢測資料型別的運算子 instanceof    檢測一個例項是否屬於某個類 constructor   建構函式 Object.prototype.toStrin

node.js取參方法req.body,req.params,req.param,req.body

node.js取參四種方法req.body,req.params,req.param,req.body 參考:https://my.oschina.net/u/2519530/blog/535309 獲取請求很中的引數是每個web後臺處理的必經之路,nodejs的 express框

JavaScript——判斷js資料型別型別檢測)

判斷js資料型別,也就是我們說的型別檢測,本文提供五種方法,分別是typeof運算子、instanceof操作符、Object.prototype.toString方法、constructor屬性、duck type。 1、typeof運算子 typeof算

五、solr刪除資料方法

1、在solr客戶端,訪問你的索引庫(我認為最方便的方法) 1)documents type 選擇 XML  2)documents 輸入下面語句 <delete><query>*:*</query></delete>

javascript中判斷資料型別方法及typeof、instanceof、constructor、toString

在 ECMAScript 規範中,共定義了 6種資料型別,分為 基本型別 和 引用型別 兩大類,如下所示: 基本型別(簡單型別):String、Number、Boolean、Undefined、Null 。由於其佔據空間固定,是簡單的資料段,為了便於提升變數查

JavaScript資料型別判斷方法

### 碼文不易啊,轉載請帶上本文連結呀,感謝感謝 https://www.cnblogs.com/echoyya/p/14416375.html 本文分享了JavaScript型別判斷的四種方法:`typeof`、`instanceof`、`Object.prototype.toString.call()

js判斷資料型別的五大方法

js中判斷資料型別有一下幾種方法: typeof、instanceof、 constructor、 prototype、 $.type()/jquery.type(),接下來主要比較一下這幾種方法的異同。 先舉幾個例子: var a = "iamstring."; var b

js判斷是否是陣列的方法

<div>1</div> <div>2</div> <div>3</div> var arr = [1, 2, 3]; //類陣

JS資料型別判斷方式及優缺點、String常用方法

資料型別判斷方式及優缺點 JS中一共有七種資料型別: 一種引用型別——Object, 六種基本資料型別——Number、String、Boolean、Null、Undifined、Symbol(ES6新增) typeof(var):返回的是一個字串,但是對於複

web大前端-JS資料型別轉換、常用輸入輸出方法prompt、write、alert、console 資料型別判斷typeof運算子

常用的三個客戶端輸出方法 document.write(str) 功能:在網頁的<body>標記,輸出str的內容 document是一個文件物件,代表整個網頁。 write()是document物件的一個輸出方法。 ".":通過小數點來呼叫物件的方法。 str:

js判斷物件資料型別方法

對js中不同資料的布林值型別總結:false:空字串;null;undefined;0;NaN。true:除了上面的false的情況其他都為true; javascript中有六種資料型別:string;boolean;Array;Object;null;undefin

js判斷各種資料型別通用方法

瞭解js的都知道, 有個typeof 用來判斷各種資料型別,有兩種寫法:typeof xxx ,typeof(xxx)如下例項:typeof 2 輸出 number typeof null 輸出 object typeof {} 輸出

JS 數組去重的方法

new return obj 元素 數組去重 != lis 相同 break 1、通過遍歷原數組和新數組是否重復。new一個新數組存放已經遍歷過的、唯一的元素。 function uniqueArr(list){   var newArr= [list[0]];   for

JS生成 UUID的方法

ide replace rsa func digits 隨機生成 turn abcdefg 標準 全局唯一標識符(GUID,Globally Unique Identifier)也稱作 UUID(Universally Unique IDentifier) 。 GUID是

js 時間轉換毫秒的方法(轉)

lpad 如果 class code 時間轉換 因此 ble string sha 將時間轉換為毫秒數的方法有四個: Date.parse()Date.UTCvalueOf()getTime() 1. Date.parse():該方法接受一個表示日期的字符串參數,然後嘗試