摘要:開(kāi)發(fā)人員自定義的任何構(gòu)造函數(shù)都將返回。在任何值上直接調(diào)用的原生方法,都會(huì)返回格式的字符串,每個(gè)類內(nèi)部都有一個(gè)屬性,這個(gè)屬性中就指定了上述字符串中構(gòu)造函數(shù)名。
JavaScript 在類型判斷上確實(shí)是有比較多的坑,在不使用 ES5 的 Array.isArray() 的情況下,如何判斷呢?
首先放棄typeofjavascript 弱類型的語(yǔ)言就是有比較多的坑,單純的typeof 是很無(wú)力的。所以用它來(lái)判斷數(shù)組肯定是不行的。
typeof 1 // number typeof undefined // undefined typeof null // object typeof [] // object typeof {} //object typeof function (){} // function
那么言歸正傳正傳,該如何判斷。
思路一:length 屬性判斷Array 對(duì)象都是有l(wèi)ength 屬性的,可不可以判斷l(xiāng)ength
function isArray(array) { return (typeof array === "object" && typeof array.length === "number") }
與這個(gè)類似的是
function isArray(array) { return (typeof array === "object" && !isNaN(array.length)) }
但是這個(gè)存在的問(wèn)題是,對(duì)于有l(wèi)ength屬性的對(duì)象,則會(huì)出現(xiàn)判斷失誤的問(wèn)題
比如:
var fakeArray = { length: 10, value: "Fake Array" }思路二:對(duì)Array實(shí)例對(duì)象的原型進(jìn)行判斷。
var arr = [1, 2, 3] arr instanceof Array // constructor 指向了原型 arr.constructor === Array
但在多iframe的情況下,由于每個(gè)iframe 是一個(gè)獨(dú)立的環(huán)境,它們之間不不共享原型鏈,則通過(guò)原型進(jìn)行判斷會(huì)出現(xiàn)錯(cuò)誤
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 // 有問(wèn)題的判斷 arr instanceof Array // false arr.constructor === Array // false思路三: Object.prototype.toString.call() 方法
適用于所有環(huán)境,只支持原生的對(duì)象,Object的toString()方法不能檢測(cè)非原生構(gòu)造函數(shù)的構(gòu)造函數(shù)名。開(kāi)發(fā)人員自定義的任何構(gòu)造函數(shù)都將返回[object Object]。在任何值上直接調(diào)用Object的原生toString()方法,都會(huì)返回[object NativeConstrctorName]格式的字符串,每個(gè)類內(nèi)部都有一個(gè)class屬性,這個(gè)屬性中就指定了上述字符串中構(gòu)造函數(shù)名。
Object.prototype.toString.call(array) === "[object Array]"
不過(guò),上面的方案也存在一定問(wèn)題,在ES6 中這樣的判斷可以被欺騙
var obj = {}; // ES6 Symbol obj[Symbol.toStringTag] = "Array"; // true console.log(isArray(obj));結(jié)論
在ES5 之后,就老老實(shí)實(shí)用Array.isArray 來(lái)判斷,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 數(shù)組類型檢測(cè)函數(shù)
2.JavaScript數(shù)組的isArray方法實(shí)現(xiàn)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107885.html
摘要:比如我們今天要討論的,在當(dāng)中如何判斷一個(gè)數(shù)組是數(shù)組。在數(shù)組的原型鏈上也能找到構(gòu)造函數(shù)由上面的幾行代碼可以看出,使用運(yùn)算符可以分辨數(shù)組和對(duì)象,可以判斷數(shù)組是數(shù)組。用判斷實(shí)例化的數(shù)組擁有一個(gè)屬性,這個(gè)屬性指向生成這個(gè)數(shù)組的方法。 如果你沒(méi)有注意過(guò)這個(gè)問(wèn)題,那么這個(gè)標(biāo)題應(yīng)該會(huì)讓你感到困惑,判斷數(shù)據(jù)類型這么基礎(chǔ)的問(wèn)題能有什么坑呢? 少年,你不能太天真了,我們朝夕面對(duì)的這門語(yǔ)言,可是JavaSc...
摘要:多個(gè)窗口意味著多個(gè)全局環(huán)境,不同的全局環(huán)境擁有不同的全局對(duì)象,從而擁有不同的內(nèi)置類型構(gòu)造函數(shù)。這可能會(huì)引發(fā)一些問(wèn)題。上面我們提到使用原生的方法來(lái)判斷值是否為數(shù)組的實(shí)例。這也意味著不是一個(gè)十分可靠的識(shí)別對(duì)象類型的方式。 在JavaScript中,可以通過(guò)typeof操作符來(lái)判斷基本數(shù)據(jù)類型(Undefined、Null、Boolean、Number和String),同時(shí)相信大家也熟知ty...
摘要:過(guò)完春節(jié)又有好多人尋找新的機(jī)會(huì),旁邊的人面試完就會(huì)分享一些問(wèn)題,明明會(huì)的但是面試的時(shí)候,想不全,面試官不滿意這個(gè)懊惱的行為,今天的文章跟大家分享下如何判斷便是是數(shù)組。 過(guò)完春節(jié)又有好多人尋找新的機(jī)會(huì),旁邊的人面試完就會(huì)分享一些問(wèn)題,明明會(huì)的但是面試的時(shí)候,想不全,面試官不滿意...這個(gè)懊惱的行為,今天的文章跟大家分享下:javascript如何判斷便是是數(shù)組。 1. typeof真的那...
摘要:過(guò)完春節(jié)又有好多人尋找新的機(jī)會(huì),旁邊的人面試完就會(huì)分享一些問(wèn)題,明明會(huì)的但是面試的時(shí)候,想不全,面試官不滿意這個(gè)懊惱的行為,今天的文章跟大家分享下如何判斷便是是數(shù)組。 過(guò)完春節(jié)又有好多人尋找新的機(jī)會(huì),旁邊的人面試完就會(huì)分享一些問(wèn)題,明明會(huì)的但是面試的時(shí)候,想不全,面試官不滿意...這個(gè)懊惱的行為,今天的文章跟大家分享下:javascript如何判斷便是是數(shù)組。 1. typeof真的那...
摘要:過(guò)完春節(jié)又有好多人尋找新的機(jī)會(huì),旁邊的人面試完就會(huì)分享一些問(wèn)題,明明會(huì)的但是面試的時(shí)候,想不全,面試官不滿意這個(gè)懊惱的行為,今天的文章跟大家分享下如何判斷便是是數(shù)組。 過(guò)完春節(jié)又有好多人尋找新的機(jī)會(huì),旁邊的人面試完就會(huì)分享一些問(wèn)題,明明會(huì)的但是面試的時(shí)候,想不全,面試官不滿意...這個(gè)懊惱的行為,今天的文章跟大家分享下:javascript如何判斷便是是數(shù)組。 1. typeof真的那...
閱讀 3067·2021-09-22 15:59
閱讀 1319·2021-08-30 09:46
閱讀 2281·2019-08-30 15:54
閱讀 2020·2019-08-26 12:15
閱讀 2546·2019-08-26 12:09
閱讀 1346·2019-08-26 11:57
閱讀 3343·2019-08-23 17:11
閱讀 1892·2019-08-23 15:59