91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

javascript中判斷數據類型的方法

發布時間:2021-06-09 14:33:49 來源:億速云 閱讀:177 作者:小新 欄目:web開發

這篇文章主要介紹了javascript中判斷數據類型的方法,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

js判斷數據類型的方法:1、利用typeof操作符,語法“typeof 變量”;2、利用instanceof運算符;3、利用constructor屬性,語法“變量.constructor==數據類型”;4、利用toString()函數。

本教程操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。

javascript判斷數據類型的方法

1、typeof

  typeof 是一個操作符,其右側跟一個一元表達式,并返回這個表達式的數據類型。

  返回的結果用該類型的字符串(全小寫字母)形式表示,包括以下 7 種:string、number、boolean、symbol、undefined、object、function 等。

typeof 'a'; // string 有效
typeof 1; // number 有效
typeof true; //boolean 有效
typeof Symbol(); // symbol 有效
typeof undefined; //undefined 有效
typeof new Function(); // function 有效
typeof null; //object 無效
typeof [1] ; //object 無效
typeof new RegExp(); //object 無效
typeof new Date(); //object 無效

總結:

  • 對于基本類型,除 null 以外,均可以返回正確的結果。

  • 對于引用類型,除 function 以外,一律返回 object 類型。

  • 對于 null ,返回 object 類型。

  • 對于 function 返回  function 類型。

  其中,null 有屬于自己的數據類型 Null ,引用類型中的數組、日期、正則 也都有屬于自己的具體類型,而 typeof 對于這些類型的處理,只返回了處于其原型鏈最頂端的 Object 類型。

2、instanceof

  instanceof 檢測的是原型,表達式為:A instanceof B,如果 A 是 B 的實例,則返回 true,否則返回 false。

[] instanceof Array; // true
new Date() instanceof Date;// true
 
function Person(){};
new Person() instanceof Person;//true
 
[] instanceof Object; // true
new Date() instanceof Object;// true
new Person instanceof Object;// true

  雖然 instanceof 能夠判斷出 [ ] 是Array的實例,但它認為 [ ] 也是Object的實例,為什么呢?

   從 instanceof 能夠判斷出 [ ].__proto__  指向 Array.prototype,而 Array.prototype.__proto__ 又指向了Object.prototype,最終 Object.prototype.__proto__ 指向了null,標志著原型鏈的結束。因此,[ ]、Array、Object 就在內部形成了一條原型鏈,如下圖所示:

javascript中判斷數據類型的方法

   從原型鏈可以看出,[] 的 __proto__  直接指向Array.prototype,間接指向 Object.prototype,所以按照 instanceof 的判斷規則,[] 就是Object的實例。依次類推,類似的 new Date()、new Person() 也會形成一條對應的原型鏈 。

  因此,instanceof 只能用來判斷兩個對象是否屬于實例關系, 而不能判斷一個對象實例具體屬于哪種類型。

   針對數組的這個問題,ES5 提供了 Array.isArray() 方法 。該方法用以確認某個對象本身是否為 Array 類型,而不區分該對象在哪個環境中創建。

if (Array.isArray(value)){
   //對數組執行某些操作
}

  Array.isArray() 本質上檢測的是對象的 [[Class]] 值。

  [[Class]] 是對象的一個內部屬性,里面包含了對象的類型信息,其格式為 [object Xxx],Xxx 就是對應的具體類型 。對于數組而言,[[Class]] 的值就是 [object Array] 。

3、constructor

  當一個函數 F被定義時,JS引擎會為F添加 prototype 原型,然后再在 prototype上添加一個 constructor 屬性,并讓其指向 F 的引用。如下圖所示:

javascript中判斷數據類型的方法

  當執行 var f = new F() 時,F 被當成了構造函數,f 是F的實例對象,此時 F 原型上的 constructor 傳遞到了 f 上,因此 f.constructor == F

javascript中判斷數據類型的方法

  可以看出,F 利用原型對象上的 constructor 引用了自身,當 F 作為構造函數來創建對象時,原型上的 constructor 就被遺傳到了新創建的對象上, 從原型鏈角度講,構造函數 F 就是新對象的類型。這樣做的意義是,讓新對象在誕生以后,就具有可追溯的數據類型。

  同樣,JavaScript 中的內置對象在內部構建時也是這樣做的,如下圖所示。

javascript中判斷數據類型的方法

總結:

  1. null 和 undefined 是無效的對象,因此是不會有 constructor 存在的,這兩種類型的數據需要通過其他方式來判斷。

  2. 函數的 constructor 是不穩定的,這個主要體現在自定義對象上,當開發者重寫 prototype 后,原有的 constructor 引用會丟失,constructor 會默認為 Object。

4、toString

  toString() 是 Object 的原型方法,調用該方法,默認返回當前對象的 [[Class]] 。這是一個內部屬性,其格式為 [object Xxx] ,其中 Xxx 就是對象的類型。

  對于 Object 對象,直接調用 toString()  就能返回 [object Object] 。而對于其他對象,則需要通過 call / apply 來調用才能返回正確的類型信息。

  語法:Object.prototype.toString.call(value);

Object.prototype.toString.call('') ;   // [object String]
Object.prototype.toString.call(1) ;    // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window 是全局對象 global 的引用

感謝你能夠認真閱讀完這篇文章,希望小編分享的“javascript中判斷數據類型的方法”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

甘南县| 深州市| 堆龙德庆县| 双牌县| 马龙县| 全州县| 永嘉县| 昌都县| 马山县| 墨江| 保靖县| 潞城市| 敦煌市| 娄底市| 阿克陶县| 唐河县| 武宣县| 盘山县| 东明县| 澄城县| 靖江市| 隆回县| 孝昌县| 麻江县| 剑川县| 湄潭县| 贵定县| 阳山县| 济阳县| 杭锦旗| 满城县| 伊宁市| 得荣县| 齐河县| 松江区| 嘉义县| 荥经县| 房产| 新丰县| 恭城| 鄱阳县|