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

資訊專欄INFORMATION COLUMN

判斷是否是數(shù)組的幾種方法— (js基礎(chǔ)復(fù)習(xí)第1期)

supernavy / 3292人閱讀

摘要:如果網(wǎng)頁(yè)中包含多個(gè)框架,那實(shí)際上就存在兩個(gè)以上不同的全局執(zhí)行環(huán)境,從而存在兩個(gè)以上不同版本的構(gòu)造函數(shù)。如果你從一個(gè)框架向另一個(gè)框架傳入一個(gè)數(shù)組,那么傳入的數(shù)組與在第二個(gè)框架中原生創(chuàng)建的數(shù)組分別具有各自不同的構(gòu)造函數(shù)。

1. 首先,typeof肯定是不行的

對(duì)于一些基本類型,typeof是可以判斷出數(shù)據(jù)類型,但是判斷一些引用類型時(shí)候,不能具體到具體哪一種類型
再來(lái)復(fù)習(xí)一下typeof的用法:

// 基本類型
typeof 123;  //number
typeof "123"; //string
typeof true; //boolean
typeof undefined; //undefined
typeof null; //object
let s = Symbol;
typeof s; //symbol

// 引用類型
typeof [1,2,3]; //object
typeof {}; //object
typeof function(){}; //function
typeof  Array; //function  Array類型的構(gòu)造函數(shù)
typeof Object; //function  Object類型的構(gòu)造函數(shù)
typeof Symbol; //function  Symbol類型的構(gòu)造函數(shù)
typeof Number; //function  Number類型的構(gòu)造函數(shù)
typeof String; //function  String類型的構(gòu)造函數(shù)
typeof Boolean; //function  Boolean類型的構(gòu)造函數(shù)
2. 兩種簡(jiǎn)單,但是不是十分準(zhǔn)確的方法
var obj = [4,67,23];
obj instanceof Array; //return true 
obj.constructor == Array; // return true

為什么不準(zhǔn)確?

2.1 首先來(lái)復(fù)習(xí)一下instanceof用法

判斷一個(gè)實(shí)例是否屬于某種類型

function Foo(name) {
    this.name = name;
}
var f = new Foo("zhangsan");
console.log(f instanceof Foo); //true
console.log(f instanceof Object); //true

判斷一個(gè)實(shí)例是否屬于它的父類型

function Person() {};
function Student() {};
var p = new Person();
Student.prototype = p;
var s = new Student();
console.log(s instanceof Student); //true
console.log(s instanceof Person); //true

記憶:
A instanceof C   等價(jià)于  A 是否是 C子類,或者后代?
2.2 instanceof 判斷邏輯?

判斷邏輯翻譯成js代碼如下:

_instanceof(f, Foo);  

function _instanceof(L, R) {
    var R = o.prototype;
    var L = L.__proto__;
    while( true) {
        if(L == null) {
            return false;
        }
        if(L == R) {
            return true;
        }
        L = L.__proto__;
    }
}
2.3 instanceof 不準(zhǔn)確的原因?

代碼如下:

    var iframe = document.createElement("iframe");
    document.body.appendChild(iframe);

    var arr = [1,2,3];
    xArray = window.frames[0].Array;  //iframe中的構(gòu)造函數(shù)
    var arrx = new xArray(4,5,6);

    console.log(arrx instanceof Array);  //false
    console.log(arrx.constructor == Array);// false

    console.log(Array.prototype == xArray.prototype); //false
    console.log(arr instanceof xArray); //false

    console.log(arrx.constructor === Array);// false
    console.log(arr.constructor === Array);// true
    console.log(arrx.constructor === xArray);// true
    console.log(Array.isArray(arrx));  //true

解釋:紅寶書,p88

instanceof操作符的問(wèn)題在于,它假定只有一個(gè)全局環(huán)境。如果網(wǎng)頁(yè)中包含多個(gè)框架,那實(shí)際上就存在兩個(gè)以上不同的全局執(zhí)行環(huán)境,從而存在兩個(gè)以上不同版本的Array構(gòu)造函數(shù)。
如果你從一個(gè)框架向另一個(gè)框架傳入一個(gè)數(shù)組,那么傳入的數(shù)組與在第二個(gè)框架中原生創(chuàng)建的數(shù)組分別具有各自不同的構(gòu)造函數(shù)。

2.4 constructor 不準(zhǔn)確的原因?

因?yàn)閏onstructor可以被重寫,所以不能確保一定是數(shù)組
example:

    var str = "abc";
    str.constructor = Array;
    str.constructor === Array // return true

而很明顯str不是數(shù)組。
而且constructor和instanceof存在同樣問(wèn)題,不同執(zhí)行環(huán)境下,constructor判斷不正確問(wèn)題。

3. isArray()

最終確定某個(gè)值到底是不是數(shù)組,而不管它是在哪個(gè)全局執(zhí)行環(huán)境中創(chuàng)建的,這個(gè)方法的用法如下。

if(Array.isArray(value)){
    return true;
}
4. Object.prototype.toString

如果在尚未實(shí)現(xiàn)isArray方法的瀏覽器中準(zhǔn)確監(jiān)測(cè)數(shù)組,我們需要用到Object.prototype.toString方法來(lái)判斷,每一個(gè)繼承自O(shè)bject的對(duì)象都擁有toString的方法。

if(!Array.isArray){
    Array.isArray = function(arg){
        return Object.prototype.toString.call(arg)==="[object Array]"
    }

}

自己可以封裝一個(gè)獲取變量類型的函數(shù)

function getType(obj) {
    return Object.prototype.toString.call(obj).slice(8,-1);
}

var a = [1,2,3];
console.log(getType(a)); //Array 

var b = function(){};
console.log(getType(b)); //Function
5. 參考文章

JavaScript instanceof 運(yùn)算符深入剖析
javascript 判斷變量是否是數(shù)組(Array)

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

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

相關(guān)文章

  • 數(shù)組的使用總結(jié)— (js基礎(chǔ)復(fù)習(xí)2)

    摘要:前一個(gè)值,當(dāng)前值,索引,數(shù)組對(duì)象產(chǎn)生新數(shù)組的迭代器方法類似,對(duì)數(shù)組的每個(gè)元素使用某個(gè)函數(shù),并返回新數(shù)組和相似,傳入一個(gè)返回值為布爾類型的函數(shù)。 1. 前言 數(shù)組真的是每天用了,但是有很多方法都是記不住,總是要百度查,很煩,所以才寫了個(gè)數(shù)組使用總結(jié),有什么不對(duì)的希望大家指出來(lái)。 2. 思路 先看看這些問(wèn)題都記得很清楚么? 創(chuàng)建數(shù)組,怎么創(chuàng)建數(shù)組的 數(shù)組的構(gòu)造方法Array有哪些方法?E...

    zhigoo 評(píng)論0 收藏0
  • 前端培訓(xùn)-初級(jí)階段(13、18)

    摘要:年月歐洲計(jì)算機(jī)制造商協(xié)會(huì)發(fā)表了標(biāo)準(zhǔn),它是的一個(gè)擴(kuò)延,它也被稱為年月首版年月日截止發(fā)布日期,的官方名稱是,國(guó)際意在更頻繁地發(fā)布包含小規(guī)模增量更新的新版本,下一版本將于年發(fā)布,命名為。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門技術(shù)就算入門,但也僅僅是入門,現(xiàn)在前端開(kāi)發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTML/CSS/JS),本著提升技術(shù)水平,打牢基礎(chǔ)知識(shí)的...

    YorkChen 評(píng)論0 收藏0
  • 復(fù)習(xí)筆記(新手向) - JS對(duì)象聲明幾種方式

    摘要:二用操作符構(gòu)造對(duì)象屬性名屬性值屬性名屬性值屬性名屬性值屬性名屬性值方法名方法名首先用創(chuàng)建一個(gè)空對(duì)象,然后用多條語(yǔ)句給對(duì)象添加屬性方法。他的寫法與三用函數(shù)聲明的方式構(gòu)造對(duì)象比較像,但是稍有不同。 -- 新手向知識(shí),就不用ES6寫法了。 一、字面量聲明 var obj = { 屬性名1 : 屬性值, 屬性名2 : 屬性值, 屬性名3 : 屬性...

    davidac 評(píng)論0 收藏0
  • 【面試系列】番外:關(guān)于糯米面試

    摘要:番外關(guān)于糯米面試結(jié)果總而言之一句話糯米的面試掛了過(guò)程把面試過(guò)程中面試官的問(wèn)題分享一下有幾種數(shù)據(jù)類型。將一個(gè)字符串轉(zhuǎn)化為數(shù)字,將數(shù)字轉(zhuǎn)化為字符串。獲取當(dāng)前網(wǎng)址并從中截取信息。究其愿意還是對(duì)字符串和數(shù)組的操作不熟練,我決定深刻反思。 番外:關(guān)于糯米面試 結(jié)果 總而言之一句話:糯米的面試掛了 過(guò)程 把面試過(guò)程中面試官的問(wèn)題分享一下: js有幾種數(shù)據(jù)類型。 將一個(gè)字符串轉(zhuǎn)化為數(shù)字,將數(shù)字轉(zhuǎn)化...

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

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

0條評(píng)論

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