摘要:開發人員自定義的任何構造函數都將返回。在任何值上直接調用的原生方法,都會返回格式的字符串,每個類內部都有一個屬性,這個屬性中就指定了上述字符串中構造函數名。
JavaScript 在類型判斷上確實是有比較多的坑,在不使用 ES5 的 Array.isArray() 的情況下,如何判斷呢?
首先放棄typeofjavascript 弱類型的語言就是有比較多的坑,單純的typeof 是很無力的。所以用它來判斷數組肯定是不行的。
typeof 1 // number typeof undefined // undefined typeof null // object typeof [] // object typeof {} //object typeof function (){} // function
那么言歸正傳正傳,該如何判斷。
思路一:length 屬性判斷Array 對象都是有length 屬性的,可不可以判斷length
function isArray(array) { return (typeof array === "object" && typeof array.length === "number") }
與這個類似的是
function isArray(array) { return (typeof array === "object" && !isNaN(array.length)) }
但是這個存在的問題是,對于有length屬性的對象,則會出現判斷失誤的問題
比如:
var fakeArray = { length: 10, value: "Fake Array" }思路二:對Array實例對象的原型進行判斷。
var arr = [1, 2, 3] arr instanceof Array // constructor 指向了原型 arr.constructor === Array
但在多iframe的情況下,由于每個iframe 是一個獨立的環境,它們之間不不共享原型鏈,則通過原型進行判斷會出現錯誤
var iframe = document.createElement("iframe") document.body.appendChild(iframe) xArray = window.frames[window.frames.length-1].Array var arr = new xArray(1,2,3) // [1,2,3] // 正確的判斷 Array.isArray(arr) // true // 有問題的判斷 arr instanceof Array // false arr.constructor === Array // false思路三: Object.prototype.toString.call() 方法
適用于所有環境,只支持原生的對象,Object的toString()方法不能檢測非原生構造函數的構造函數名。開發人員自定義的任何構造函數都將返回[object Object]。在任何值上直接調用Object的原生toString()方法,都會返回[object NativeConstrctorName]格式的字符串,每個類內部都有一個class屬性,這個屬性中就指定了上述字符串中構造函數名。
Object.prototype.toString.call(array) === "[object Array]"
不過,上面的方案也存在一定問題,在ES6 中這樣的判斷可以被欺騙
var obj = {}; // ES6 Symbol obj[Symbol.toStringTag] = "Array"; // true console.log(isArray(obj));結論
在ES5 之后,就老老實實用Array.isArray 來判斷,ES5之前可以使用上面pollyfill。
if (!Array.isArray) { return Object.prototype.toString.call(array) === "[object Array]"; }
以此延伸,那么判斷其他類型就可以使用類似的方法
var is = function (obj,type) { return (type === "Null" && obj === null) || (type === "Undefined" && obj === void 0 ) || (type === "Number" && isFinite(obj)) || Object.prototype.toString.call(obj).slice(8,-1) === type; }
參考:
1.Javascript isArray 數組類型檢測函數
2.JavaScript數組的isArray方法實現
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107885.html
摘要:比如我們今天要討論的,在當中如何判斷一個數組是數組。在數組的原型鏈上也能找到構造函數由上面的幾行代碼可以看出,使用運算符可以分辨數組和對象,可以判斷數組是數組。用判斷實例化的數組擁有一個屬性,這個屬性指向生成這個數組的方法。 如果你沒有注意過這個問題,那么這個標題應該會讓你感到困惑,判斷數據類型這么基礎的問題能有什么坑呢? 少年,你不能太天真了,我們朝夕面對的這門語言,可是JavaSc...
摘要:多個窗口意味著多個全局環境,不同的全局環境擁有不同的全局對象,從而擁有不同的內置類型構造函數。這可能會引發一些問題。上面我們提到使用原生的方法來判斷值是否為數組的實例。這也意味著不是一個十分可靠的識別對象類型的方式。 在JavaScript中,可以通過typeof操作符來判斷基本數據類型(Undefined、Null、Boolean、Number和String),同時相信大家也熟知ty...
摘要:過完春節又有好多人尋找新的機會,旁邊的人面試完就會分享一些問題,明明會的但是面試的時候,想不全,面試官不滿意這個懊惱的行為,今天的文章跟大家分享下如何判斷便是是數組。 過完春節又有好多人尋找新的機會,旁邊的人面試完就會分享一些問題,明明會的但是面試的時候,想不全,面試官不滿意...這個懊惱的行為,今天的文章跟大家分享下:javascript如何判斷便是是數組。 1. typeof真的那...
摘要:過完春節又有好多人尋找新的機會,旁邊的人面試完就會分享一些問題,明明會的但是面試的時候,想不全,面試官不滿意這個懊惱的行為,今天的文章跟大家分享下如何判斷便是是數組。 過完春節又有好多人尋找新的機會,旁邊的人面試完就會分享一些問題,明明會的但是面試的時候,想不全,面試官不滿意...這個懊惱的行為,今天的文章跟大家分享下:javascript如何判斷便是是數組。 1. typeof真的那...
摘要:過完春節又有好多人尋找新的機會,旁邊的人面試完就會分享一些問題,明明會的但是面試的時候,想不全,面試官不滿意這個懊惱的行為,今天的文章跟大家分享下如何判斷便是是數組。 過完春節又有好多人尋找新的機會,旁邊的人面試完就會分享一些問題,明明會的但是面試的時候,想不全,面試官不滿意...這個懊惱的行為,今天的文章跟大家分享下:javascript如何判斷便是是數組。 1. typeof真的那...
閱讀 3062·2021-09-22 15:59
閱讀 1314·2021-08-30 09:46
閱讀 2276·2019-08-30 15:54
閱讀 2011·2019-08-26 12:15
閱讀 2538·2019-08-26 12:09
閱讀 1338·2019-08-26 11:57
閱讀 3339·2019-08-23 17:11
閱讀 1886·2019-08-23 15:59