摘要:判斷一個對象是不是數(shù)組類型少部分人可能首先會想到可以看出是可以判斷出基本數(shù)據(jù)類型的,函數(shù)也能判斷出來,但是對象數(shù)組日期都會返回這樣就根本無法判斷一個對象是不是數(shù)組類型。
判斷一個對象是不是數(shù)組類型 typeof
少部分人可能首先會想到 typeof
var n = 3, b = true, s = "Hello", x = null, y, obj1 = function() {}, obj2 = {}, obj3 = [], obj4 = new Date(); console.log( typeof n, //number typeof b, //boolean typeof s, //string typeof x, //object typeof y, //undefined typeof obj1, //function typeof obj2, //object typeof obj3, //object typeof obj4 //object );
可以看出 typeof 是可以判斷出基本數(shù)據(jù)類型的,函數(shù)也能判斷出來,但是對象、數(shù)組、日期都會返回 object,這樣就根本無法判斷一個對象是不是數(shù)組類型。所以 typeof 宣告無能為力
判斷其父級原型對象var obj1 = {}, obj2 = [1, 2, 3], obj3 = new Date(); console.log(obj1.__proto__ == Array.prototype); //false console.log(obj2.__proto__ == Array.prototype); //true console.log(obj3.__proto__ == Array.prototype); //false
但是 __proto__ 是內(nèi)部屬性,本不應(yīng)該被訪問到,我們可以用 Object.getPrototypeOf(obj) 方法來代替他,雖然這個方法其實內(nèi)部原理也是他,但是還是有不同的。
console.log(Object.getPrototypeOf(obj1) == Array.prototype); //false console.log(Object.getPrototypeOf(obj2) == Array.prototype); //true console.log(Object.getPrototypeOf(obj3) == Array.prototype); //false判斷其構(gòu)造函數(shù)
obj instanceof Array 判斷 obj 是不是被構(gòu)造函數(shù) Array 創(chuàng)造出來的
console.log(obj1 instanceof Array); //false console.log(obj2 instanceof Array); //true console.log(obj3 instanceof Array); //false
但instanceof 不僅判斷直接父類型,而是所有在原型鏈上的類型,都返回 true ,所以如果你創(chuàng)建一個對象但是把他的 __proto__ 指向 Array 的原型,然后判斷其類型,也會返回 true。
obj1.__proto__ = Array.prototype; console.log(obj1 instanceof Array); //true判斷對象內(nèi)部的 class 屬性
每個對象內(nèi)部,都有一個隱藏的 class 屬性,記錄該對象創(chuàng)建時的數(shù)據(jù)類型 class 屬性不會隨繼承關(guān)系的改變而改變。(就相當(dāng)于查人的 DNA 了吧,小樣還想偽裝。)
這里有一個問題:內(nèi)置類型的原型對象中幾乎都重寫了新的 toString(),只有最頂層的 toString() 才能輸出對象的 class 屬性值,
因此我們可以用 call 來使用最牛皮的身份鑒別
console.log( Object.prototype.toString.call(obj1) == /*[object Object]*/ "[object Array]" ); //false console.log( Object.prototype.toString.call(obj2) == /*[object Array]*/ "[object Array]" ); //true console.log( Object.prototype.toString.call(obj3) == /*[object Date]*/ "[object Array]" ); //falseArray.isArray
Array.isArray 也可以彌補 typeof 的不足
Array.isArray(obj1); //false Array.isArray(obj2); //true Array.isArray(obj3); //false
更多文章來自我的 github ,求個 star 鼓勵一下吧!
https://github.com/MLuminary/Blog/issues
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/94849.html
摘要:最新版本見,點擊查看歷史版本提供一套實用的基礎(chǔ)函數(shù)任意格式的日期轉(zhuǎn)換函數(shù),瀏覽器相關(guān)操作函數(shù)等全局參數(shù)設(shè)置默認全局參數(shù)基礎(chǔ)函數(shù)判斷是否非數(shù)值判斷是否為有限數(shù)值判斷判斷是否數(shù)組判斷是否小數(shù)判斷是否整數(shù)判斷是否對象判斷是否對象判斷是否對象判斷是 最新版本見 Github,點擊查看歷史版本 XEUtils 提供一套實用的基礎(chǔ)函數(shù)、任意格式的日期轉(zhuǎn)換函數(shù),瀏覽器相關(guān)操作函數(shù)等... API ...
摘要:注意類繼承時的問題繼承自方法中對象直接繼承和間接繼承的都會報解決的問題通常是讓對象的手動指向自己將自己的類賦值給對象的屬性基類不會報了原博參考,,,,判斷為 js基礎(chǔ)(二):構(gòu)造函數(shù)與原型 一、常見實例 判斷是否為對象 let obj = {} // 1.Object.prototype.toString if (Object.prototype.toString.call(obj...
摘要:用做緩存的高階函數(shù)用高階函數(shù)的好處是無需暴露不同要求的緩存對象在外面,形成一個閉包。函數(shù)內(nèi)部調(diào)用函數(shù)得到操作后的值,并緩存在對象中,如果再對同一個值進行操作時,則直接從緩存中取,無需再調(diào)用函數(shù)計算。 以下摘取的函數(shù),在 shared 目錄下公用的工具方法。文件在 util.js 中,githu地址。 提取了一些常用通用的函數(shù)進行剖析,主要包含以下內(nèi)容: 創(chuàng)建一個被凍結(jié)的空對象 判斷是...
摘要:多個窗口意味著多個全局環(huán)境,不同的全局環(huán)境擁有不同的全局對象,從而擁有不同的內(nèi)置類型構(gòu)造函數(shù)。這可能會引發(fā)一些問題。上面我們提到使用原生的方法來判斷值是否為數(shù)組的實例。這也意味著不是一個十分可靠的識別對象類型的方式。 在JavaScript中,可以通過typeof操作符來判斷基本數(shù)據(jù)類型(Undefined、Null、Boolean、Number和String),同時相信大家也熟知ty...
摘要:比如我們今天要討論的,在當(dāng)中如何判斷一個數(shù)組是數(shù)組。在數(shù)組的原型鏈上也能找到構(gòu)造函數(shù)由上面的幾行代碼可以看出,使用運算符可以分辨數(shù)組和對象,可以判斷數(shù)組是數(shù)組。用判斷實例化的數(shù)組擁有一個屬性,這個屬性指向生成這個數(shù)組的方法。 如果你沒有注意過這個問題,那么這個標題應(yīng)該會讓你感到困惑,判斷數(shù)據(jù)類型這么基礎(chǔ)的問題能有什么坑呢? 少年,你不能太天真了,我們朝夕面對的這門語言,可是JavaSc...
摘要:一關(guān)閉一個流或者且不拋出異常。刪除文件或文件夾且不會拋出異常。此外,還支持等十格式化參數(shù),返回一個或者可用字符串把或者等轉(zhuǎn)換為十一加密,返回位加密加密加密加密,返回位十二是否為空根據(jù)條件篩選集合元素根據(jù)指定方法處理集合元素,類似的。 一. org.apache.commons.io.IOUtils closeQuietly 關(guān)閉一個IO流、socket、或者selector且不...
閱讀 3569·2021-11-15 11:36
閱讀 1060·2021-11-11 16:55
閱讀 694·2021-10-20 13:47
閱讀 2993·2021-09-29 09:35
閱讀 3428·2021-09-08 10:45
閱讀 2554·2019-08-30 15:44
閱讀 849·2019-08-30 11:10
閱讀 1428·2019-08-29 13:43