php检测数组类型,javascript中通过哪些方法来检测数组类型?
typeof操作符。
對(duì)于Function、String、Number、Undefined這幾種類型的對(duì)象來(lái)說(shuō),不會(huì)有什么問(wèn)題,但是針對(duì)Array的對(duì)象就沒(méi)什么用途了:alert(typeof null); // "object"
alert(typeof []); // "object"
instanceof
當(dāng)只有一個(gè)全局執(zhí)行環(huán)境時(shí)適用,如果包含多個(gè)框架,就存在兩個(gè)以上不同版本的Array構(gòu)造函數(shù),如果從一個(gè)框架向另一個(gè)框架傳遞數(shù)組,傳入的數(shù)組與在第二個(gè)框架中原生創(chuàng)建的數(shù)組分別具有不同的構(gòu)造函數(shù),即為不同類型
if (value instanceof Array) {
//對(duì)數(shù)組執(zhí)行某項(xiàng)操作
}
Array.isArray() 方法
因?yàn)槭荅S5新增的,只支持IE9+、Firefox 4+、Safari 5+、Opera 10.5+和Chrome
if (Array.isArray(value)) {
//對(duì)數(shù)組執(zhí)行某些操作
}
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ù)名。
var value = []
console.log(Object.prototype.toString.call(value))//"[Object Array]"
由于原生數(shù)組的構(gòu)造函數(shù)名和作用域無(wú)關(guān),因此使用toString()方法就能保證輸出一樣的值。
為什么不使用對(duì)象自己的toString() 方法?
var value = []
console.log(value.toString())//" "
value = ['pp','oo']
console.log(value.toString())//"pp,oo"
value = ['pp',"oo"]
console.log(Object.prototype.toString.call(value))//[object Array]
Array的tostring()方法被重寫了(很多原生對(duì)象均如此),所以它會(huì)調(diào)用自己構(gòu)造函數(shù)上的toString()方法,返回其他的字符串
還可以用此方法來(lái)判斷是不是原生函數(shù)或者正則表達(dá)式
function isFunction(value){
return Object.prototype.toString.call(value) === “[object Function]”
}//不適用于IE中以COM對(duì)象實(shí)現(xiàn)的任何函數(shù)
function isRegExp(value){
return Object.prototype.toString.call(value) === “[object RegExp]”
}
對(duì)象的constructor屬性
除了instanceof,我們還可以利用每個(gè)對(duì)象都具有constructor的屬性來(lái)判斷其類型,于是乎我們可以這樣做:var arr = [];
alert(arr.constructor == Array); // true
貌似后兩個(gè)解決方案是無(wú)懈可擊的,但真的是這樣么?天有不測(cè)風(fēng)云,當(dāng)你在多個(gè)frame中來(lái)回穿梭的時(shí)候,令人沮喪的問(wèn)題出現(xiàn)了: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]
// 哎呀!
arr instanceof Array; // false
// 哎呀呀!
arr.constructor === Array; // false
由于每個(gè)iframe都有一套自己的執(zhí)行環(huán)境,跨frame實(shí)例化的對(duì)象彼此是不共享原型鏈的,因此導(dǎo)致上述檢測(cè)代碼失效!怎么辦怎么辦??嗯,javascript是動(dòng)態(tài)語(yǔ)言,或許萬(wàn)金油“鴨式辨型”(duck type)可以助我們一臂之力“如果它走起路來(lái)像鴨子,叫起來(lái)也像鴨子,那就當(dāng)他是鴨子吧”,同理,可以檢測(cè)某些數(shù)組對(duì)象特有的能力來(lái)做判斷,這個(gè)法子已經(jīng)有人用了,比如Prototype框架,來(lái)看看它實(shí)現(xiàn)的Object.isArray方法:isArray: function(object) {
return object != null && typeof object == "object" &&
'splice' in object && 'join' in object;
}
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的php检测数组类型,javascript中通过哪些方法来检测数组类型?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: OPPO K9怎么样?值得入手吗?
- 下一篇: php ci model条件查询,Lar