国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

判斷是否是數組的幾種方法— (js基礎復習第1期)

supernavy / 3290人閱讀

摘要:如果網頁中包含多個框架,那實際上就存在兩個以上不同的全局執行環境,從而存在兩個以上不同版本的構造函數。如果你從一個框架向另一個框架傳入一個數組,那么傳入的數組與在第二個框架中原生創建的數組分別具有各自不同的構造函數。

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

對于一些基本類型,typeof是可以判斷出數據類型,但是判斷一些引用類型時候,不能具體到具體哪一種類型
再來復習一下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類型的構造函數
typeof Object; //function  Object類型的構造函數
typeof Symbol; //function  Symbol類型的構造函數
typeof Number; //function  Number類型的構造函數
typeof String; //function  String類型的構造函數
typeof Boolean; //function  Boolean類型的構造函數
2. 兩種簡單,但是不是十分準確的方法
var obj = [4,67,23];
obj instanceof Array; //return true 
obj.constructor == Array; // return true

為什么不準確?

2.1 首先來復習一下instanceof用法

判斷一個實例是否屬于某種類型

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

判斷一個實例是否屬于它的父類型

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   等價于  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 不準確的原因?

代碼如下:

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

    var arr = [1,2,3];
    xArray = window.frames[0].Array;  //iframe中的構造函數
    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操作符的問題在于,它假定只有一個全局環境。如果網頁中包含多個框架,那實際上就存在兩個以上不同的全局執行環境,從而存在兩個以上不同版本的Array構造函數。
如果你從一個框架向另一個框架傳入一個數組,那么傳入的數組與在第二個框架中原生創建的數組分別具有各自不同的構造函數。

2.4 constructor 不準確的原因?

因為constructor可以被重寫,所以不能確保一定是數組
example:

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

而很明顯str不是數組。
而且constructor和instanceof存在同樣問題,不同執行環境下,constructor判斷不正確問題。

3. isArray()

最終確定某個值到底是不是數組,而不管它是在哪個全局執行環境中創建的,這個方法的用法如下。

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

如果在尚未實現isArray方法的瀏覽器中準確監測數組,我們需要用到Object.prototype.toString方法來判斷,每一個繼承自Object的對象都擁有toString的方法。

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

}

自己可以封裝一個獲取變量類型的函數

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 運算符深入剖析
javascript 判斷變量是否是數組(Array)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99140.html

相關文章

  • 數組的使用總結— (js基礎復習2)

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

    zhigoo 評論0 收藏0
  • 前端培訓-初級階段(13、18)

    摘要:年月歐洲計算機制造商協會發表了標準,它是的一個擴延,它也被稱為年月首版年月日截止發布日期,的官方名稱是,國際意在更頻繁地發布包含小規模增量更新的新版本,下一版本將于年發布,命名為。 前端最基礎的就是 HTML+CSS+Javascript。掌握了這三門技術就算入門,但也僅僅是入門,現在前端開發的定義已經遠遠不止這些。前端小課堂(HTML/CSS/JS),本著提升技術水平,打牢基礎知識的...

    YorkChen 評論0 收藏0
  • 復習筆記(新手向) - JS對象聲明幾種方式

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

    davidac 評論0 收藏0
  • 【面試系列】番外:關于糯米面試

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

    PiscesYE 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<