久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

如何獲取javascript變量的類型

獲取javascript變量類型的方法:1、使用typeof操作符,語法“typeof 變量”;2、使用jQuery的“$.type()”方法;3、通過構(gòu)造函數(shù)來獲取類型。

如何獲取javascript變量的類型

本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5&&jquery1.10.0版、Dell G3電腦。

在JavaScript中,如何準(zhǔn)確獲取變量的類型名是一個(gè)經(jīng)常使用的問題.

但是常常不能獲取到變量的精確名稱,或者必須使用jQuery 中的方法,這里 我通過 typeof ,jQuery.type 和 通過構(gòu)造函數(shù)來獲取變量類型 這三種方法詳細(xì)介紹一遍.

希望可以對(duì)你提供幫助.

看到題目的第一眼,有些同學(xué)可能會(huì)想到 typeof 運(yùn)算符.


使用 typeof 獲取基本的類型

在JavaScript語言中,給出了使用 typeof 運(yùn)算符來獲取基本的類型名.(注意不是基本類型)

這是 typeof 的全部用法

01-typeof.htm

console.log('typeof of 10 ~~~~' +typeof 10); console.log('typeof of "a" ~~~~' +typeof 'a'); console.log('typeof of true ~~~~' +typeof true); console.log('typeof of {} ~~~~' +typeof {}); console.log('typeof of /123/ ~~~~' +typeof /123/); console.log('typeof of function(){} ~~~~' +typeof function(){}); console.log('typeof of undefined ~~~~' +typeof undefined); console.log('typeof of null ~~~~' +typeof null);

這是結(jié)果

如何獲取javascript變量的類型

按照上面的打印結(jié)果,總結(jié)出下面要注意的幾點(diǎn)

  • typeof (引用類型) 除了函數(shù), 都是 'object',比如 typeof /123/

  • typeof null 為'object'

  • typeof undefined 為 'undefined',通常, 如果使用兩等號(hào), null == undefined 為真.

  • 轉(zhuǎn)換為數(shù)字的常見用法 "10"-0, 如果沒有轉(zhuǎn)換成功,返回NaN,由于NaN 的一個(gè)特性: NaN != NaN,故判斷轉(zhuǎn)換成功與否的常見做法: (這也是我參見 jQuery的源碼發(fā)現(xiàn)的,jQuery源碼讀100遍都不為過)
    ("10x" - 0) == ("10x" - 0); // 結(jié)果為假!
    如何獲取javascript變量的類型

使用jQuery中的方法$.type()

現(xiàn)在看看jQuery是怎么做的

// 先申明一個(gè)對(duì)象,目的是用來做映射 var class2type = {}; // 申明一個(gè)core_toString() 的方法,得到最原始的toString() 方法,因?yàn)樵诤芏鄬?duì)象中,toStrintg() 已經(jīng)被重寫  var core_toString() = class2type.toString;
// 這里為 toStrintg() 后的結(jié)果和類型名做一個(gè)映射,申明一個(gè)core_toString() 后的結(jié)果,而值就是類型名 jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {     class2type[ "[object " + name + "]" ] = name.toLowerCase(); });

因?yàn)?Object.prototype.toString() 方法調(diào)用結(jié)果如下

var core_toString = {}.toString; console.log( core_toString.call(1) ); console.log( core_toString.call("11") ); console.log( core_toString.call(/123/) ); console.log( core_toString.call({}) ); console.log( core_toString.call(function(){}) ); console.log( core_toString.call([]) ); console.log( core_toString.call(true) ); console.log( core_toString.call(new Date()) ); console.log( core_toString.call(new Error() )); console.log( core_toString.call(null) ); console.log( core_toString.call(undefined) ); console.log( String(null) ); console.log( String(undefined) );

如何獲取javascript變量的類型

上面的打印結(jié)果與

class2type[ "[object " + name + "]" ] = name.toLowerCase();

不謀而合!

這是jQuery.type 的核心方法

type: function( obj ) {     if ( obj == null ) {         return String( obj );     }     // Support: Safari <= 5.1 (functionish RegExp)     return typeof obj === "object" || typeof obj === "function" ?         class2type[ core_toString.call(obj) ] || "object" :         typeof obj; },

注意,為什么把 null 或者 undefined 單獨(dú)討論呢,因?yàn)?在一些版本瀏覽器中

console.log(core_toString.call(null)); console.log(core_toString.call(undefined));

這是會(huì)報(bào)錯(cuò)的!

如果是對(duì)象類型,另:由于 在一些低版本的瀏覽器中,typeof /123/ 會(huì)返回的是 "function" 而不是 "object",所以這里要判斷是否是函數(shù),要明白 這里的 typeof obj === function 不是為了函數(shù)討論的,因?yàn)楹瘮?shù)本身就可以通過typeof 來得到類型.

typeof obj === "object" || typeof obj === "function" ?         class2type[ core_toString.call(obj) ]

就直接返回class2type 中鍵值對(duì)的結(jié)果,,如果不是,那么一定就是基本類型, 通過 typeof 就可以啦.

class2type[ core_toString.call(obj) ] || "object" : // 這是防止一些未知情況的,如果未取到,就返回object

但是 jQuery.type 有一個(gè)很大的缺陷

這是一個(gè)自定義類型

function Person(){    this.name = 'pawn'; } var p = Person.toString();

// 注意,這里會(huì)打印 [object Object],通過上面的方法,無法得到精確的自定義類型
這也是 它的一個(gè)大缺陷了!

下面,我們通過構(gòu)造函數(shù)的方式來獲取精確類型

通過構(gòu)造函數(shù)來獲取類型

在理解這個(gè)方法之前,需要理解兩個(gè)點(diǎn)

prorotype 原型屬性

我們知道,任何對(duì)象或者函數(shù)都直接或者間接的繼承自O(shè)bject 或者 Function, (其實(shí)最終Function 是繼承自 Object 的,這屬于原型鏈的知識(shí)了)。那么,任何一個(gè)對(duì)象都具有原型對(duì)象 __proto__ (這個(gè)對(duì)象只在chrome 和 firefox 暴露,但是在其他瀏覽器中也是存在的),這個(gè)原型對(duì)象就是這個(gè)對(duì)象的構(gòu)造函數(shù)的原型屬性(這里可能有點(diǎn)繞).

由于 任何函數(shù)都具有 原型屬性prototype,并且這個(gè)原型屬性具有一個(gè)默認(rèn)屬性 constructor,它是這個(gè)函數(shù)的引用,看下面的代碼

  function Person(){       this.name = 'pawn';   }   console.log(Person.prototype.constructor === Person);

如何獲取javascript變量的類型

發(fā)現(xiàn),這兩個(gè)東西其實(shí)一個(gè)東西

但是,在某些情況下,需要這么寫

  function Person(){       this.name = 'pawn';   }   Person.protype = {       XX: ... ,       xx: ... ,       ...   }

這么做,就會(huì)覆蓋原本的 protype 方法,那么construcor 就不存在了,這是,必須要顯示的申明這個(gè)對(duì)象

  Person.protype = {       construction: Person,       XX: ... ,       xx: ... ,       ...   }

在jQuery的中,就是這么做的,

  jQuery.fn = jQuery.prototype = {     constructor: jQuery,     init: function( selector, context, rootjQuery ) {         var match, elem;

關(guān)于 jQuery對(duì)象封裝的方式 也是非常值得研究


  • Function.prototype.toString()
    如何獲取javascript變量的類型

注意,這里已經(jīng)不是熟悉 [object Object],而是 已經(jīng)重寫了.

也就是,如果調(diào)用一個(gè)函數(shù)的toString() 方法.那么就會(huì)打印這個(gè)函數(shù)的函數(shù)體.

如何獲取javascript變量的類型


好了,經(jīng)過上面兩個(gè)步驟,你明白我要做什么了嗎?

如何通過構(gòu)造函數(shù)來獲得變量的類型?

判斷是否是基本類型

   var getType = function(obj){        if(obj == null){           return String(obj);        }        if(typeof obj === 'object' || typeof obj === 'fucntion'){            ...        }else{            // 如果不是引用類型,那么就是基本類型            return typeof obj        }    }

如果是對(duì)象或者函數(shù)類型

   function Person(){        this.name = 'pawn';    }    var p = new Person();    console.log(p.constructor);

如何獲取javascript變量的類型

現(xiàn)在要做的事 : 如何將Person 提取出來呢?
毋庸置疑,字符串切割那一套肯定可以辦到,但是太 low 啦!
這里,我使用正則將Person提取出來

 var regex = /functions(.+?)(/    function Person(){     this.name = 'pawn';    }    var p = new Person();    var c = p.constructor    var regex = /functions(.+?)(/;    console.log('|' + regex.exec(c)[1] + '|');

如何獲取javascript變量的類型

使用name

其實(shí),除了上面的正則,每個(gè)函數(shù)還有一個(gè)name屬性,返回函數(shù)名,但是ie8 是不支持的.

因此上面的代碼可以寫為:

var getType = function(obj){     if(obj == null){         return String(obj);     }     if(typeof obj === 'object' || typeof obj === 'function'){          var constructor = obj.constructor;         if(constructor && constructor.name){             return constructor.name;         }         var regex = /functions(.+?)(/;         return regex.exec(c)[1];     }else{         // 如果不是引用類型,那么就是基本;類型         return typeof obj;     } };

但是上面的代碼太丑啦,將其簡化

簡化

var getType = function(obj){     if(obj == null){         return String(obj);     }     if(typeof obj === 'object' || typeof obj === 'function'){          return obj.constructor && obj.constructor.name.toLowerCase() ||            /functions(.+?)(/.exec(obj.constructor)[1].toLowerCase();     }else{         // 如果不是引用類型,那么就是基本類型         return typeof obj;     } };

還是比較麻煩,繼續(xù)簡化

var getType = function(obj){     if(obj == null){        return String(obj);     }     return typeof obj === 'object' || typeof obj === 'function' ?       obj.constructor && obj.constructor.name && obj.constructor.name.toLowerCase() ||           /functions(.+?)(/.exec(obj.constructor)[1].toLowerCase():       typeof obj; };

好了,已經(jīng)全部弄完了,寫個(gè)代碼測試一下:

function Person(){     this.name = 'pawn'; } var p = new Person();  console.log(getType(p)); console.log(getType(1)); console.log(getType("a")); console.log(getType(false)); console.log(getType(/123/)); console.log(getType({})); console.log(getType(function(){})); console.log(getType(new Date())); console.log(getType(new Error())); console.log(getType( null)); console.log(getType( undefined));

如何獲取javascript變量的類型

【推薦學(xué)習(xí):javascript高級(jí)教程】

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
美女久久99| 中文日韩欧美| 日韩欧乱色一区二区三区在线| 欧美va亚洲va日韩∨a综合色| 高潮一区二区| 天堂中文av在线资源库| www.com.cn成人| 欧美精品资源| 欧美69视频| 午夜日韩福利| 亚洲一级特黄| 99国产精品| 一区二区三区四区精品视频| 亚洲另类视频| 欧美天堂在线| 美女国产一区二区三区| 欧美激情一区| 精品一区二区三区免费看| 国产一区一一区高清不卡| 成人午夜在线| 国产精品91一区二区三区| 蜜臀久久99精品久久久画质超高清 | 日本成人在线不卡视频| 亚洲tv在线| 日本免费在线视频不卡一不卡二| 国产亚洲电影| 免费在线日韩av| 色一区二区三区四区| 日韩激情一区| 国产精品人人爽人人做我的可爱| 日韩精品免费视频一区二区三区 | 日本欧美韩国一区三区| 欧美午夜网站| 岛国av在线网站| 天堂√8在线中文| 欧美另类综合| 亚洲精品进入| 精品视频在线观看网站| 九色porny丨国产首页在线| 午夜国产精品视频| 日韩中文欧美在线| 国产剧情一区二区在线观看| 国产一区福利| 精品在线99| 中文字幕中文字幕精品| 欧美成人精品一级| 99久久婷婷这里只有精品| 六月天综合网| 久久精品免视看国产成人| 精品国产一区二| 成人av二区| 国产精品大片| 黑丝美女一区二区| 日韩毛片网站| 日韩高清中文字幕一区二区| 国产亚洲午夜| 久久中文字幕一区二区三区| 久久久久网站| 涩涩涩久久久成人精品| 98精品久久久久久久| 亚洲一区二区三区高清不卡| 国产欧美啪啪| 久久人人99| 18国产精品| 日韩毛片视频| 日韩精品久久久久久| 高清一区二区三区av| 亚洲一区二区小说| 性感美女一区二区在线观看| 日韩精品五月天| 久久精品国产68国产精品亚洲| 久久狠狠亚洲综合| 国产偷自视频区视频一区二区| 精品少妇一区| 日韩精品中文字幕吗一区二区| 久久要要av| 久久一区欧美| 亚洲精品大片| 黑丝一区二区| 韩日一区二区| 日本va欧美va精品发布| 在线国产一区二区| 国产精品麻豆久久| 欧美一区免费| 日韩精品一级二级 | 日韩国产91| 亚洲少妇在线| 亚洲视频综合| 黑人精品一区| 国产精品久久久久久久久免费高清 | 激情欧美一区二区三区| 国产精品白丝久久av网站| 欧美日韩免费观看一区=区三区 | 日韩精品第一| 不卡一区综合视频| 在线中文字幕播放| 国产精品一区二区av日韩在线| 亚洲精品1区| 欧美一级精品| 久久久国产亚洲精品| 国产精品99在线观看| 国产精品一区高清| 91欧美极品| 婷婷亚洲精品| 男女男精品网站| 午夜av一区| 久久男女视频| 天堂av在线一区| 今天的高清视频免费播放成人| 国产成人77亚洲精品www| 国产女人18毛片水真多18精品| 日韩中文字幕不卡| 亚洲一区区二区| 免费国产自久久久久三四区久久 | 国产成人免费视频网站视频社区| 国产精品一卡| 国产免费av国片精品草莓男男| 亚洲精品伊人| 少妇精品久久久一区二区| 爽好久久久欧美精品| 国产精品免费看| 久久精品导航| 91精品国产成人观看| 欧美日韩精品免费观看视完整| а√天堂8资源中文在线| 欧美国产一级| 色网在线免费观看| 欧美成人a交片免费看| 亚洲一区资源| 欧美日韩中文字幕一区二区三区| 久久精品国内一区二区三区水蜜桃| 久久久男人天堂| 色88888久久久久久影院| 五月激情久久| 蜜桃一区二区三区| 午夜一级久久| 欧美专区一区二区三区| 久久国产精品久久w女人spa| 一区二区三区国产在线| 欧美日韩99| 国产一区二区三区国产精品| av日韩中文| 在线成人直播| 中文不卡在线| 欧美偷窥清纯综合图区| 国产精品男女| 久久99免费视频| 国产盗摄——sm在线视频| 久久三级福利| 石原莉奈一区二区三区在线观看| 一区二区国产在线观看| 亚洲精品成人一区| 国产欧美自拍| 日韩av二区| 欧美日韩国产在线一区| 亚洲精品人人| 国产精品久久乐| 日本蜜桃在线观看视频| 伊人精品在线| 欧美亚洲一区二区三区| 丁香婷婷久久| 亚洲综合不卡| 国产伦精品一区二区三区千人斩| 中文字幕在线官网| 影音先锋国产精品| 日韩精品一区二区三区免费视频| 麻豆精品久久久| 久久美女性网| 亚洲精品乱码久久久久久蜜桃麻豆| 91精品国产自产观看在线| 国产在线日韩精品| 男女精品网站| 国产一区二区三区亚洲综合| 黄色亚洲精品| 国产精品nxnn| 在线一区免费| 国产精品久久| 精品在线91| 国产精品自拍区| 日韩不卡在线| 日韩亚洲精品在线观看| 成人在线观看免费视频| 亚洲欧美日本国产专区一区| 欧美黄色一区二区| 亚洲一区网站| 国产一区三区在线播放| 在线免费观看亚洲| 黑人精品一区| 欧美亚洲一区二区三区| 蜜桃视频欧美| 国产精品mv在线观看| 中文一区在线| 国产一区二区久久久久| 亚洲综合五月| 欧美亚洲日本精品| 欧美在线黄色| 五月婷婷亚洲| 国内精品亚洲| 欧美久久精品| 亚洲欧美日韩国产一区二区|