亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

【基礎(chǔ)】JavaScript類型判斷

YuboonaZhang / 1140人閱讀

摘要:基本類型類對(duì)象純對(duì)象類數(shù)組其中部分參考了的函數(shù)實(shí)現(xiàn)。比如說所以如果此時(shí)對(duì)象不是由內(nèi)置構(gòu)造函數(shù)生成的對(duì)象,這個(gè)為。判斷對(duì)于類數(shù)組對(duì)象,只要該對(duì)象中存在屬性并且為非負(fù)整數(shù)且在有限范圍之內(nèi)即可判斷為類數(shù)組對(duì)象。

本文主要講解如何準(zhǔn)確判斷JavaScript中出現(xiàn)的各種類型和對(duì)象。(基本類型、Object類、Window對(duì)象、純對(duì)象plainObject、類數(shù)組)其中部分參考了jQuery的函數(shù)實(shí)現(xiàn)。
typeof

JavaScript定義的數(shù)據(jù)類型有UndefinedNull、BooleanNumber、String、Object、Symbol(ES6新增)。

其中typeof對(duì)大部分的數(shù)據(jù)類型都能夠準(zhǔn)確識(shí)別,如下:

typeof undefined // "undefined"
typeof null // "object"
typeof true // "boolean"
typeof 1 // "number"
typeof "s" // "string"
typeof {} // "object"
typeof function a() {} // "function"
typeof Symbol("2") // "symbol"

其中返回的字符串首字母都是小寫的。

對(duì)于typeof null === "object"來說,這其實(shí)是一個(gè)bug。

在JavaScript中,Object下還有很多細(xì)分的類型,比如說DateRegExp、Error、Array、Function。

typeof除了能夠準(zhǔn)確的判斷出Function之外,對(duì)于其他細(xì)分類型均返回object

Object.prototype.toString()

當(dāng)toString方法被調(diào)用的時(shí)候,下面的步驟會(huì)被執(zhí)行:

如果this值是undefined,就返回[object Undefined]

如果this的值是null,就返回[object Null]

O成為ToObject(this)的結(jié)果

class成為O的內(nèi)部屬性[[Class]]的值

最后返回由"[object "class"]"三個(gè)部分組成的字符串

該方法至少可以識(shí)別14種類型。

// 以下是11種:
var number = 1;          // [object Number]
var string = "123";      // [object String]
var boolean = true;      // [object Boolean]
var und = undefined;     // [object Undefined]
var nul = null;          // [object Null]
var obj = {a: 1}         // [object Object]
var array = [1, 2, 3];   // [object Array]
var date = new Date();   // [object Date]
var error = new Error(); // [object Error]
var reg = /a/g;          // [object RegExp]
var func = function a(){}; // [object Function]

function checkType() {
    for (var i = 0; i < arguments.length; i++) {
        console.log(Object.prototype.toString.call(arguments[i]))
    }
}

checkType(number, string, boolean, und, nul, obj, array, date, error, reg, func)

// 還有不常見的Math、JSON
console.log(Object.prototype.toString.call(Math)); // [object Math]
console.log(Object.prototype.toString.call(JSON)); // [object JSON]

// 還有一個(gè)arguments
function a() {
    console.log(Object.prototype.toString.call(arguments)); // [object Arguments]
}
a();
type API
結(jié)合上面我們可以寫一個(gè)type函數(shù),其中基本類型值走typeof,引用類型值走toString。
var class2type = {};

// 生成class2type映射
"Boolean Number String Function Array Date RegExp Object Error".split(" ").map(function(item, index) {
    class2type["[object " + item + "]"] = item.toLowerCase();
})

function type(obj) {
    // 一箭雙雕
    if (obj == null) {
        return obj + "";
    }
    return typeof obj === "object" || typeof obj === "function" ?
        class2type[Object.prototype.toString.call(obj)] || "object" :
        typeof obj;
}

通過toLowerCase()小寫化和typeof的結(jié)果是小寫一致。

注意IE6中toString()會(huì)把UndefinedNull都識(shí)別為[object Object],所以加了一個(gè)判斷,直接調(diào)用+來隱式toString()-> "null"。

這里之所以class2type[Object.prototype.toString.call(obj)] || "object"是考慮到ES6新增的Symbol、Map、Set在集合class2type中沒有,直接把他們識(shí)別成object。

這個(gè)type其實(shí)就是jQuery中的type

isFunction

之后可以直接封裝:

function isFunction(obj) {
    return type(obj) === "function";
}
數(shù)組
var isArray = Array.isArray || function( obj ) {
    return type(obj) === "array";
}

jQuery3.0中已經(jīng)完全使用Array.isArray()。

plainObject

plainObject翻譯為中文即為純對(duì)象,所謂的純對(duì)象,就是該對(duì)象是通過{}new Object()創(chuàng)建的。

判斷是否為“純對(duì)象”,是為了和其他對(duì)象區(qū)分開比如說null、數(shù)組以及宿主對(duì)象(所有的DOMBOM都是數(shù)組對(duì)象)等。

jQuery中有提供了該方法的實(shí)現(xiàn),除了規(guī)定該對(duì)象是通過{}new Object()創(chuàng)建的,且對(duì)象含有零個(gè)或者多個(gè)鍵值對(duì)外,一個(gè)沒有原型(__proto__)的對(duì)象也是一個(gè)純對(duì)象。

console.log($.isPlainObject({})) // true

console.log($.isPlainObject(new Object)) // true

console.log($.isPlainObject(Object.create(null))); // true

jQuery3.0版本的plainObject實(shí)現(xiàn)如下:

var toString = Object.prototype.toString;

var hasOwn = Object.prototype.hasOwnProperty;

function isPlainObject(obj) {
    var proto, Ctor;

    // 排除掉明顯不是obj的以及一些宿主對(duì)象如Window
    if (!obj || toString.call(obj) !== "[object Object]") {
        return false;
    }

    /**
     * getPrototypeOf es5 方法,獲取 obj 的原型
     * 以 new Object 創(chuàng)建的對(duì)象為例的話
     * obj.__proto__ === Object.prototype
     */
    proto = Object.getPrototypeOf(obj);

    // 沒有原型的對(duì)象是純粹的,Object.create(null) 就在這里返回 true
    if (!proto) {
        return true;
    }

    /**
     * 以下判斷通過 new Object 方式創(chuàng)建的對(duì)象
     * 判斷 proto 是否有 constructor 屬性,如果有就讓 Ctor 的值為 proto.constructor
     * 如果是 Object 函數(shù)創(chuàng)建的對(duì)象,Ctor 在這里就等于 Object 構(gòu)造函數(shù)
     */
    Ctor = hasOwn.call(proto, "constructor") && proto.constructor;

    // 在這里判斷 Ctor 構(gòu)造函數(shù)是不是 Object 構(gòu)造函數(shù),用于區(qū)分自定義構(gòu)造函數(shù)和 Object 構(gòu)造函數(shù)
    return typeof Ctor === "function" && hasOwn.toString.call(Ctor) === hasOwn.toString.call(Object);
}

注意最后這一句非常的重要:

hasOwn.toString.call(Ctor) === hasOwn.toString.call(Object)

hasOwn.toString調(diào)用的其實(shí)是Function.prototype.toString()而不是Object.prototype.toString(),因?yàn)?b>hasOwnProperty是一個(gè)函數(shù),它的原型是Function,于是Function.prototype.toString覆蓋了Object.prototype.toString

Function.prototype.toString()會(huì)把整個(gè)函數(shù)體轉(zhuǎn)換成一個(gè)字符串。如果該函數(shù)是內(nèi)置函數(shù)的話,會(huì)返回一個(gè)表示函數(shù)源代碼的字符串。比如說:

Function.prototype.toString(Object) === function Object() { [native code] }

所以如果此時(shí)對(duì)象不是由內(nèi)置構(gòu)造函數(shù)生成的對(duì)象,這個(gè)hasOwn.toString.call(Ctor) === hasOwn.toString.call(Object)false。

function Person(name) {
    this.name = name;
}
var person = new Person("Devin");
plainObject(person) === false; // true
// 其實(shí)就是`hasOwn.toString.call(Ctor) === "function Person(name) { this.name = name; }"
Window對(duì)象

Window對(duì)象有一個(gè)特性:Window.window指向自身。

Window.window === Window; //true
類數(shù)組對(duì)象

常見的類數(shù)組有函數(shù)的argumentsNodeList對(duì)象。

判斷

對(duì)于類數(shù)組對(duì)象,只要該對(duì)象中存在length屬性并且length為非負(fù)整數(shù)且在有限范圍之內(nèi)即可判斷為類數(shù)組對(duì)象。

JavaScript權(quán)威指南中提供了方法:

function isArrayLike(o) {
    if (o && // o is not null, undefined, etc
        // o is an object
        typeof o === "object" &&
        // o.length is a finite number
        isFinite(o.length) &&
        // o.length is non-negative
        o.length >= 0 &&
        // o.length is an integer
        o.length === Math.floor(o.length) &&
        // o.length < 2^32
        o.length < 4294967296) //數(shù)組的上限值
          return true;
    else 
          return false;
}

以上的判斷無論是真的數(shù)組對(duì)象或是類數(shù)組對(duì)象都會(huì)返回true,那我們?nèi)绾螀^(qū)分到底是真的數(shù)組對(duì)象還是類數(shù)組對(duì)象?

其實(shí)只需要先判斷是否為數(shù)組對(duì)象即可。

function utilArray(o) {
    if (Array.isArray(o)) {
        return "array";
    }
    if (isArrayLike(o)) {
        return "arrayLike";
    } else {
        return "neither array nor arrayLike";
    }
}
類數(shù)組對(duì)象的特征

類數(shù)組對(duì)象并不關(guān)心除了數(shù)字索引和length以外的東西。

比如說:

var a = {"1": "a", "2": "b", "4": "c", "abc": "abc", length: 5};
Array.prototype.join.call(a, "+"); // +a+b++c

其中,"0""3"沒有直接省略為兩個(gè)undefined,同樣的abc被忽略為undefined。

如果length多出實(shí)際的位數(shù)會(huì)補(bǔ)undefined(空位也補(bǔ)充undefined),少位則截?cái)嗪竺娴臄?shù)組成員。

var a = {"1": "a", "2": "b", "4": "c", "abc": "abc", length: 6};
Array.from(a); // [undefined, "a", "b", undefined, "c", undefined]

var a = {"1": "a", "2": "b", "4": "c", "abc": "abc", length: 5};
Array.from(a); // [undefined, "a", "b", undefined, "c"]

var a = {"1": "a", "2": "b", "4": "c", "abc": "abc", length: 4};
Array.from(a); // [undefined, "a", "b", undefined]
類數(shù)組對(duì)象的轉(zhuǎn)換

Array.from

該方法從一個(gè)類似數(shù)組或可迭代對(duì)象中創(chuàng)建一個(gè)新的數(shù)組實(shí)例。

Array.from("foo");
// ["f", "o", "o"]

Array.prototype.slice

該方法返回一個(gè)從開始到結(jié)束(不包括結(jié)束)選擇的數(shù)組的一部分淺拷貝到一個(gè)新數(shù)組對(duì)象。

var a = {"0":"a", "1":"b", "2":"c", length: 3};
Array.prototype.slice.call(a, 0); // ["a", "b", "c"]

ES6擴(kuò)展運(yùn)算符

var a = "hello";
[...a]; //["h", "e", "l", "l", "o"]

參考鏈接:

https://github.com/mqyqingfen...

https://github.com/mqyqingfen...

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

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

相關(guān)文章

  • javascript基礎(chǔ)判斷變量類型

    摘要:判斷變量類型數(shù)據(jù)類型種操作符可能返回的值如下注意的能力有限,其對(duì)于類型返回的都是使用場(chǎng)景區(qū)分對(duì)象和原始類型要區(qū)分一種對(duì)象類型和另一種對(duì)象類型可以使用運(yùn)算符或?qū)ο髮傩赃\(yùn)算符用法左邊的運(yùn)算數(shù)是一個(gè)右邊運(yùn)算數(shù)是對(duì)象類的名字或者構(gòu)造函數(shù)返回或如果是 判斷變量類型 javaSctipt數(shù)據(jù)類型7種: Number, String, Boolean, Null, Undefined, Object...

    jsdt 評(píng)論0 收藏0
  • task0002(一)- JavaScript數(shù)據(jù)類型及語言基礎(chǔ)

    摘要:不過讓流行起來的原因應(yīng)該是是目前所有主流瀏覽器上唯一支持的腳本語言。經(jīng)過測(cè)試,數(shù)字字符串布爾日期可以直接賦值,修改不會(huì)產(chǎn)生影響。再考慮對(duì)象類型為或者的情況。對(duì)于結(jié)果聲明其類型。判斷對(duì)象的類型是還是,結(jié)果類型更改。 轉(zhuǎn)載自我的個(gè)人博客 歡迎大家批評(píng)指正 1. 第一個(gè)頁(yè)面交互 這里最需要學(xué)習(xí)的老師的代碼中,每一部分功能都由函數(shù)控制,沒有創(chuàng)建一個(gè)全部變量。且最后有一個(gè)函數(shù)來控制執(zhí)行代碼...

    elarity 評(píng)論0 收藏0
  • javascript基礎(chǔ)細(xì)節(jié)

    摘要:語法部分屬性默認(rèn)的就是,所以不必顯式指定為。不強(qiáng)制在每個(gè)語句結(jié)尾加,會(huì)自動(dòng)加分號(hào),但是在某些情況下會(huì)改變程序的語義,所以最好主動(dòng)加。實(shí)際上,默認(rèn)有一個(gè)全局對(duì)象。 語法部分: 1.type 屬性: 默認(rèn)的 type 就是 javascript, 所以不必顯式指定 type 為 javascript。2.javascript 不強(qiáng)制在每個(gè)語句結(jié)尾加 ; , javascript 會(huì)自...

    wangxinarhat 評(píng)論0 收藏0
  • 【1】JavaScript 基礎(chǔ)深入——數(shù)據(jù)類型深入理解與總結(jié)

    摘要:類型的實(shí)例首先要理解的含義是例子的意思,實(shí)際上是判斷是否是的一個(gè)實(shí)例。 數(shù)據(jù)類型深入理解 數(shù)據(jù)類型分類 基本(值)類型(5種) String:任意字符串 Number:任意的數(shù)字 boolean:true/false null:null undefined:undefined 對(duì)象(引用)類型(3種) Object:任意對(duì)象 Array:一種特別的對(duì)象(數(shù)值下...

    since1986 評(píng)論0 收藏0
  • JavaScript數(shù)據(jù)類型及語言基礎(chǔ)--ife

    摘要:判斷是否為一個(gè)函數(shù),返回一個(gè)值。使用遞歸來實(shí)現(xiàn)一個(gè)深度克隆,可以復(fù)制一個(gè)目標(biāo)對(duì)象,返回一個(gè)完整拷貝被復(fù)制的對(duì)象類型會(huì)被限制為數(shù)字字符串布爾日期數(shù)組對(duì)象。經(jīng)過測(cè)試,數(shù)字字符串布爾日期可以直接賦值,修改不會(huì)產(chǎn)生影響。再考慮對(duì)象類型為或者的情況。 //判斷arr是否為一個(gè)數(shù)組,返回一個(gè)bool值 首先javascript有5大基本數(shù)據(jù)類型:Undefined,Null,Boolean,Num...

    RayKr 評(píng)論0 收藏0
  • Js基礎(chǔ)知識(shí)(一) - 變量

    摘要:內(nèi)置函數(shù)和對(duì)象中內(nèi)置了一些函數(shù)和對(duì)象,很多語言都會(huì)有內(nèi)置的方法,直接可以調(diào)用開發(fā)。根據(jù)語法標(biāo)準(zhǔn)提供的內(nèi)置函數(shù)包括和。注意基礎(chǔ)語法提供的內(nèi)置函數(shù)和方法只有這些,像那是瀏覽器提供給我們的。強(qiáng)制類型轉(zhuǎn)換大家應(yīng)該都知道。 js基礎(chǔ) - 變量 *大家對(duì)js一定不會(huì)陌生,入門很簡(jiǎn)單(普通入門),很多人通過網(wǎng)絡(luò)資源、書籍、課堂等很多途徑學(xué)習(xí)js,但是有些js基礎(chǔ)的只是往往被大家遺漏,本章就從js變量...

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

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

0條評(píng)論

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