成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

關(guān)于js的類(lèi)型檢測(cè)

Cheriselalala / 443人閱讀

摘要:原始類(lèi)型又有種引用類(lèi)型有而檢測(cè)這些類(lèi)型的變量有種辦法,,。而關(guān)于引用類(lèi)型,還可以嘗試下操作符??偠灾绻付▌t保存的實(shí)際上就是的值,是一個(gè)基本類(lèi)型。

javascript的變量類(lèi)型分為原始類(lèi)型和引用類(lèi)型。

原始類(lèi)型又有5種:

number

string

boolean

null

undefined

引用類(lèi)型有:

Function

Array

Date

Object

RegExp

而檢測(cè)這些類(lèi)型的變量有3種辦法:typeof,instanceof,Object.prototype.toString.call。讓我來(lái)一一例舉,廢話(huà)不多說(shuō),上代碼。

//首先是typeof
var obj = 1;
typeof obj; //"number"
obj = "abc"
typeof obj; //"string"
obj = false
typeof obj; //"boolean"
obj = undefined;
typeof obj; //"undefined"
obj = null;
typeof obj; //"object",WTF,其實(shí)這是js的一個(gè)bug,人艱不拆 T_T

obj = function(){};
typeof obj; //"function"
obj = [];
typeof obj; //"object"
obj = {};
typeof obj; //"object"
obj = /w/g;
typeof obj //"object"

從上面我們可以得出type能檢測(cè)原始類(lèi)型number,string,boolean,undefined,引用類(lèi)型的function。這里容我邪惡的笑一笑。
而關(guān)于引用類(lèi)型,還可以嘗試下instanceof操作符。

var obj = function(){};
obj instanceof Function; //true
obj = [];
obj instanceof Array; //true
obj = {};
obj instanceof Object; //true
obj = new Date()
obj instanceof Date; //true
obj = /w/g;
obj instanceof RegExp; //true
//....橋豆麻袋, 事情其實(shí)還沒(méi)完呢
obj = [];
obj instanceof Object; //true  草草嗒,所有引用類(lèi)型其實(shí)都是繼承自O(shè)bject對(duì)象的,所以你懂的。

incetanceof 操作符能鑒別引用類(lèi)型,可惜有個(gè)缺憾是,如果想鑒別一個(gè)變量object類(lèi)型而不是其他的function,array,date什么的,仍然需要花一番力氣。
這里我們是不是漏了什么,如果..

var obj = new String("abc");
typeof obj; //"object" 。 
obj instanceof String; //true 。 

天了個(gè)擼,不能愉快玩耍了。要解釋這個(gè), 就得解釋js里變量的賦值規(guī)則。

原始類(lèi)型的變量直接保存原始值,而不是一個(gè)只想對(duì)象的指針。如果一個(gè)變量賦值給另一個(gè)變量,那么每個(gè)變量都它自己的一份數(shù)據(jù)拷貝,并不會(huì)相互影響。

引用類(lèi)型的變量保存的是一個(gè)指向內(nèi)存中實(shí)際對(duì)象所在的指針(或者說(shuō)引用)。因此當(dāng)你將一個(gè)對(duì)象賦值給變量時(shí),實(shí)際是賦值給這個(gè)變量一個(gè)指針。意味著將一個(gè)變量賦值給另一個(gè)變量時(shí),兩個(gè)變量指向的是內(nèi)存中同一個(gè)對(duì)象。

var obj = "abc";
obj.something = 1;
var firstChar = obj.charAt(0); //"a"
console.log(obj.something); //undefined
//實(shí)際上js做了這樣的處理
var obj = "abc";
var temp = new String(obj);
var firstChar = temp.charAt(0); //"a"
temp.something = 1;
temp = null;
console.log(obj.something); //undefined

創(chuàng)建了一個(gè)臨時(shí)的引用類(lèi)型變量去訪問(wèn)屬性,修改屬性,然后就被釋放了。阿咧,扯遠(yuǎn)了,這和我們這片的內(nèi)容啥關(guān)系。。
總而言之,如果指定obj = "abc"則obj保存的實(shí)際上就是abc的值,是一個(gè)基本類(lèi)型。而如果指定obj = new String("abc")那么obj實(shí)際上保存的是一個(gè)指向字符串對(duì)象的指針。所以就不難理解兩者對(duì)于typeofinstanceof的差別了
額,讀者:“說(shuō)了這么多,你有沒(méi)有一種萬(wàn)全的手段哇”。好吧, 我們來(lái)一個(gè)簡(jiǎn)單又粗暴的鑒別手段。

var obj = 1;
Object.prototype.toString.call(obj) === "[object Number]"; //true
obj = new Number(1);
Object.prototype.toString.call(obj) === "[object Number]"; //true

obj = [];
Object.prototype.toString.call(obj) === "[object Array]"; //true
obj = new Array();
Object.prototype.toString.call(obj) === "[object Array]"; //true
Object.prototype.toString.call(obj) === "[object Object]"; //false

這個(gè)方法是不是很好用呢, 哇哈哈哈哈。
總結(jié)歸納了下,我列舉了一些校驗(yàn)函數(shù):

//低版本ie中undefined變量可以被修改,所以使用void 0 獲取真實(shí)的undefined值,
var isUndefined = function(obj) {
    //or: return typeof obj === "undefined";
    return obj === void 0;
};
//typeof null 的結(jié)果是"object"。
var isNull = function(obj) {
    return obj === null;
};
// boolean值,number值和string值需要考慮兩種情況,值為字面量時(shí)使用typeof和Object.prototype.toString能檢測(cè); 
// 值為構(gòu)造函數(shù)構(gòu)建的時(shí)候需要使用Object.prototype.toString或者instanceof檢測(cè)
var isBoolean = function(obj) {
    return Object.prototype.toString.call(obj) == "[object Boolean]";
};
var isNumber = function(obj) {
    return Object.prototype.toString.call(obj) == "[object Number]";
};
var isString = function(obj) {
    return Object.prototype.toString.call(obj) == "[object String]";
};
var isNaN = function(obj) {
    return obj !== obj;
};

//typeof 操作符在引用類(lèi)型的變量里能對(duì)function有效。
var isFunction = function(obj) {
    //or:  return Object.prototype.toString.call(obj) == "[object Function]";
    return typeof obj === "function";

};
var isDate = function(obj) {
    return Object.prototype.toString.call(obj) == "[object Date]";
}
var isArray = function(obj) {
    return Object.prototype.toString.call(obj) == "[object Array]";
}
var isObject = function(obj) {
    //or: return obj === Object(obj);
    return Object.prototype.toString.call(obj) == "[object Object]";
}
var isRegExp = function(obj) {
    //or: return obj === Object(obj);
    return Object.prototype.toString.call(obj) == "[object RegExp]";
}

var has = function(obj, key) {
    return Object.prototype.hasOwnProperty.call(obj, key);
};
//判斷數(shù)組,字符串,對(duì)象是否為空
var isEmpty = function(obj) {
    if (obj == null) return true;
    if (isArray(obj) || isString(obj)) return obj.length === 0;
    for (var key in obj) if (has(obj, key)) return false;
    return true;
};

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85920.html

相關(guān)文章

  • 你不知道js技巧

    摘要:所謂的高級(jí),其實(shí)就是講了一些我們平常用不到或許用了不知道,但是非常實(shí)在的東西。比如如果你想檢測(cè)里面的屬性值的話(huà),基本上是不可能的。要知道,我們是有情懷的淫。 JS進(jìn)階 說(shuō)起這個(gè)應(yīng)該算是老生常談了吧。所謂的高級(jí),其實(shí)就是講了一些我們平常用不到(或許用了不知道),但是非常實(shí)在的東西。算是熟練掌握js的一個(gè)必經(jīng)road吧。 檢測(cè)函數(shù)類(lèi)型 其實(shí)檢測(cè)函數(shù)的類(lèi)型應(yīng)該算是js的一個(gè)痛點(diǎn),因?yàn)閖s是一...

    edagarli 評(píng)論0 收藏0
  • 《編寫(xiě)可維護(hù) JavaScript》讀書(shū)筆記

    摘要:最近閱讀了編寫(xiě)可維護(hù)的,在這里記錄一下讀書(shū)筆記。禁止使用,,,的字符串形式。避免使用級(jí)事件處理函數(shù)。讓事件處理程序成為接觸到對(duì)象的唯一函數(shù)。檢測(cè)函數(shù)是檢測(cè)檢測(cè)函數(shù)的最佳選擇。為特定瀏覽器的特性進(jìn)行測(cè)試,并僅當(dāng)特性存在時(shí)即可應(yīng)用特性檢測(cè)。 最近閱讀了《編寫(xiě)可維護(hù)的 JavaScript》,在這里記錄一下讀書(shū)筆記。書(shū)中主要基于三個(gè)方向來(lái)講解怎么增加代碼的可維護(hù)性:編程風(fēng)格、編程實(shí)踐、自動(dòng)化...

    tuniutech 評(píng)論0 收藏0
  • JavaScript數(shù)據(jù)類(lèi)型及其檢測(cè)

    摘要:值的比較只進(jìn)行值的比較會(huì)進(jìn)行數(shù)據(jù)類(lèi)型的轉(zhuǎn)換。只要在當(dāng)前實(shí)例的原型鏈上,我們用其檢測(cè)出來(lái)的結(jié)果都是。但檢測(cè)與不一樣,還可以處理基本數(shù)據(jù)類(lèi)型的檢測(cè)。 showImg(https://segmentfault.com/img/remote/1460000016733921); 一、JavaScript有幾種類(lèi)型的值? Javascript有兩種數(shù)據(jù)類(lèi)型,分別是基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型。其中...

    starsfun 評(píng)論0 收藏0
  • JavaScript數(shù)據(jù)類(lèi)型及其檢測(cè)

    摘要:值的比較只進(jìn)行值的比較會(huì)進(jìn)行數(shù)據(jù)類(lèi)型的轉(zhuǎn)換。只要在當(dāng)前實(shí)例的原型鏈上,我們用其檢測(cè)出來(lái)的結(jié)果都是。但檢測(cè)與不一樣,還可以處理基本數(shù)據(jù)類(lèi)型的檢測(cè)。 showImg(https://segmentfault.com/img/remote/1460000016733921); 一、JavaScript有幾種類(lèi)型的值? Javascript有兩種數(shù)據(jù)類(lèi)型,分別是基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型。其中...

    dingding199389 評(píng)論0 收藏0
  • JavaScript數(shù)據(jù)類(lèi)型及其檢測(cè)

    摘要:值的比較只進(jìn)行值的比較會(huì)進(jìn)行數(shù)據(jù)類(lèi)型的轉(zhuǎn)換。只要在當(dāng)前實(shí)例的原型鏈上,我們用其檢測(cè)出來(lái)的結(jié)果都是。但檢測(cè)與不一樣,還可以處理基本數(shù)據(jù)類(lèi)型的檢測(cè)。 showImg(https://segmentfault.com/img/remote/1460000016733921); 一、JavaScript有幾種類(lèi)型的值? Javascript有兩種數(shù)據(jù)類(lèi)型,分別是基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型。其中...

    Moxmi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<