成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

javascript 數(shù)據(jù)類型判斷 (常見庫的數(shù)據(jù)類型判斷源碼的分析)

libin19890520 / 3575人閱讀

摘要:對象類型常見的有,,,正則新增自己提供的樂行判斷如果不對對象做嚴(yán)格區(qū)分使用。的實(shí)現(xiàn)使用了原型繼承的表示左表達(dá)式,表示右表達(dá)式,它是用是否等于來判斷對象的類型的。常見框架和庫的實(shí)數(shù)據(jù)類型判斷測試這里將的實(shí)現(xiàn)原理抽取出來,用原生實(shí)現(xiàn)。

JavaScript一共有六種數(shù)據(jù)類型,分為原始類型(又名基本類型)和對象類型(又名引用類型)

原始類型有五種,分別為number,string,boolean,undefined,null五種。

對象類型常見的有Function,Array,Date,正則

ES6新增Symbol

JavaScript 自己提供的樂行判斷 type

如果不對對象做嚴(yán)格區(qū)分使用type。

number:

typeof 1; // "number"

string:

typeof "hello world"; // "string"

boolean:

typeof true; // "boolean"

undefined:

typeof undefined; // "undefined"

null:

typeof null; // "undefined" (特別)

object:

typeof {};  // "object"

Symbol:

typeof Symbol(); // "symbol"

null要多帶帶處理,就像jQuery中一樣,如果要判斷的對象為null,就直接返回 String(obj)

因此,可以寫一個判斷基本類型的方法:

var type = function(obj) {
    if(obj === null) return String(obj);
    return typeof obj;
}
instanceof

instanceof 是用來明確對象為某種特定類型的方法。

instanceof 的實(shí)現(xiàn)使用了原型繼承的L表示左表達(dá)式,R表示右表達(dá)式,它是用L.__proto__ 是否等于 R.prototype 來判斷對象的類型的。

String:

var str = new String("hello world");

str instanceof String // true

String:

var str = new Number("10");

str instanceof String // true

Datte:

var o = new Date();

o instanceof Date; // true

Array:

var o = new Array();

o instanceof Array; // true

RegExp:

var reg = new RegExp("/^[a-z]$/");

reg instanceof RegExp; // true

Object:

var o = new Object();

o instanceof Object; // true

var o2 = {};

o2 instanceof Object; // true

Function:

var o = function() {};

o instanceof Function; // true

Func(自定義):

function Func() {}

var o = new Func();

o instanceof Func; // true

instanceof 即可以驗(yàn)證自定義對象,也可以驗(yàn)證內(nèi)置對象類型,但有一點(diǎn)我們要注意,那就是他們本身就是對象。

var str = new String("hello world");

str instanceof Object; // true

我們在一開始就說明了instanceof的實(shí)現(xiàn)原理,知道instanceof左邊是右邊的實(shí)例,所以我們可以用如下代碼獲取對象的類型名:

obje.__proto__.constructor.name;

因此,我們可以寫一個判斷對象類型的方法如下:

objectType = function(obj) {
    if(typeof obj === "object" || typeof obj === "function") {
        return obj.__proto__.constructor.name;
    }
}

上面的方法雖好,但是ie瀏覽器不支持 __proto__(這個屬性也是我們判斷瀏覽器與非瀏覽器的常用方式)。

下面介紹一個萬能的方法。

Object.prototype.toString.call(obj)
Object.prototype.toString.call("hello world"); // "[object String]"

Object.prototype.toString.call(1); // "[object Number]"

Object.prototype.toString.call(true); // "[object Boolean]"

Object.prototype.toString.call(null); // "[object Null]"

Object.prototype.toString.call(); // "[object Undefined]"

Object.prototype.toString.call([]); // "[object Array]"

Object.prototype.toString.call({}); // "[object Object]"

Object.prototype.toString.call(new Date()); // "[object Date]"

Object.prototype.toString.call(/test/i); // "[object RegExpArray]"

Object.prototype.toString.call(function () {}); // "[object Function]"

獲取數(shù)據(jù)類型的代碼如下:

var core_toString = Object.prototype.toString;
var getObjectType = function(obj) () {
    return core_toString.call(obj).slice(8, -1);
}

這個方法可以判斷所有的數(shù)據(jù)類型,也是官方推薦的,但是在實(shí)際的開發(fā)中,我們使用 typeof 來判斷基本類型,用 Objet.prototype.toString.call(obj) 判斷引用類型。

常見框架和庫的實(shí)數(shù)據(jù)類型判斷

jQuery:

var class2type = {};
var core_toString = Object.prototype.toString;

"Boolean Number String Function Array Date RegExp Object Error".split(" ").forEach(function(name, i) {
    class2type["[object " + name + "]"] = name.toLowerCase();
});

var getType = function (obj) {
    if (obj == null) {
        return String(obj);
    }
    return typeof obj === "object" || typeof obj === "function" ?
        class2type[ core_toString.call(obj) ] || "object" :
        typeof obj;
};
// 測試
getType(function(){}); // "function"
getType([]); // "array"

這里將jQuery的實(shí)現(xiàn)原理抽取出來,用原生js實(shí)現(xiàn)。

vue.js

/**
 * 判斷是否為基本數(shù)據(jù)類型
 */
function isPrimitive (value) {
  return (
    typeof value === "string" ||
    typeof value === "number" ||
    // $flow-disable-line
    typeof value === "symbol" ||
    typeof value === "boolean"
  )
}

/**
 * 判斷是否為普通對象
 */
function isObject (obj) {
  return obj !== null && typeof obj === "object"
}

/**
 * 獲取原生類型,如: [object Object]
 */
var _toString = Object.prototype.toString;

function toRawType (value) {
  return _toString.call(value).slice(8, -1)
}

/**
 * 普通對象
 */
function isPlainObject (obj) {
  return _toString.call(obj) === "[object Object]"
}
/**
 * 正則對象
 */
function isRegExp (v) {
  return _toString.call(v) === "[object RegExp]"
}

angular2:

function isPresent(obj) {
return obj !== undefined && obj !== null;
}
exports.isPresent = isPresent;
function isBlank(obj) {
return obj === undefined || obj === null;
}
exports.isBlank = isBlank;
function isBoolean(obj) {
return typeof obj === "boolean";
}
exports.isBoolean = isBoolean;
function isNumber(obj) {
return typeof obj === "number";
}
exports.isNumber = isNumber;
function isString(obj) {
return typeof obj === "string";
}
exports.isString = isString;
function isFunction(obj) {
return typeof obj === "function";
}
exports.isFunction = isFunction;
function isType(obj) {
return isFunction(obj);
}
exports.isType = isType;
function isStringMap(obj) {
return typeof obj === "object" && obj !== null;
}
exports.isStringMap = isStringMap;
function isPromise(obj) {
return obj instanceof _global.Promise;
}
exports.isPromise = isPromise;
function isArray(obj) {
return Array.isArray(obj);
}
exports.isArray = isArray;
function isDate(obj) {
return obj instanceof exports.Date && !isNaN(obj.valueOf());
}
exports.isDate = isDate;

我們常見的就是這幾種實(shí)現(xiàn)方式,或是這幾種方式的混合(zepto.js)。

JavaScript相關(guān)文章github.com

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/92545.html

相關(guān)文章

  • Android面試整理(附答案)

    摘要:和體現(xiàn)了對不同異常情況的分類。是程序正常運(yùn)行中,可以預(yù)料的意外情況,可能并且應(yīng)該被捕獲,進(jìn)行相應(yīng)的處理。是指在正常情況下,不大可能出現(xiàn)的情況,絕大部分都會使程序處于非正常不可恢復(fù)的狀態(tài)。常見的非對稱加密包括等。 面試,無非都是問上面這些問題(挺多的 - -!),聘請中高級的安卓開發(fā)會往深的去問,并且會問一延伸二。以下我先提出幾點(diǎn)重點(diǎn),是面試官基本必問的問題,請一定要去了解! 基礎(chǔ)知識...

    Vultr 評論0 收藏0
  • underscore源碼學(xué)習(xí)(一)

    摘要:所以,剛開始,我從源碼比較短的包含注釋只有行開始學(xué)習(xí)起。一般,在客戶端瀏覽器環(huán)境中,即為,暴露在全局中。學(xué)習(xí)以后判斷直接使用看起來也優(yōu)雅一點(diǎn)滑稽臉。在的函數(shù)視線中,的作用執(zhí)行一個傳入函數(shù)次,并返回由每次執(zhí)行結(jié)果組成的數(shù)組。 前言 最近在社區(qū)瀏覽文章的時(shí)候,看到了一位大四學(xué)長在尋求前端工作中的面經(jīng),看完不得不佩服,掌握知識點(diǎn)真是全面,無論是前端后臺還是其他,都有涉獵。 在他寫的文章中,有...

    gclove 評論0 收藏0
  • 【underscore.js 源碼解讀】常用類型判斷以及一些有用工具方法

    摘要:最近開始看源碼,并將源碼解讀放在了我的計(jì)劃中。今天就跟大家聊一聊中一些常用類型檢查方法,以及一些工具類的判斷方法。用是否含有屬性來判斷工具類判斷方法接下來看下一些常用的工具類判斷方法。 Why underscore 最近開始看 underscore.js 源碼,并將 underscore.js 源碼解讀 放在了我的 2016 計(jì)劃中。 閱讀一些著名框架類庫的源碼,就好像和一個個大師對話...

    tanglijun 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<