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

資訊專欄INFORMATION COLUMN

javascript 判斷是否為數組 isArray()

liaoyg8023 / 1337人閱讀

摘要:開發人員自定義的任何構造函數都將返回。在任何值上直接調用的原生方法,都會返回格式的字符串,每個類內部都有一個屬性,這個屬性中就指定了上述字符串中構造函數名。

JavaScript 在類型判斷上確實是有比較多的坑,在不使用 ES5 的 Array.isArray() 的情況下,如何判斷呢?

首先放棄typeof

javascript 弱類型的語言就是有比較多的坑,單純的typeof 是很無力的。所以用它來判斷數組肯定是不行的。

    typeof 1    // number
    typeof undefined  // undefined
    typeof null // object
    typeof []   // object
    typeof {}   //object
    typeof function (){} // function

那么言歸正傳正傳,該如何判斷。

思路一:length 屬性判斷

Array 對象都是有length 屬性的,可不可以判斷length

  function isArray(array) {
      return (typeof array === "object" && typeof array.length === "number")
  }

與這個類似的是

  function isArray(array) {
      return (typeof array === "object" && !isNaN(array.length))
  }

但是這個存在的問題是,對于有length屬性的對象,則會出現判斷失誤的問題
比如:

    var fakeArray = {
        length: 10,
        value: "Fake Array"
    }
    
思路二:對Array實例對象的原型進行判斷。
    var arr = [1, 2, 3]
    arr instanceof Array
    
    // constructor 指向了原型
    arr.constructor === Array
    

但在多iframe的情況下,由于每個iframe 是一個獨立的環境,它們之間不不共享原型鏈,則通過原型進行判斷會出現錯誤

var iframe = document.createElement("iframe")
document.body.appendChild(iframe)
xArray = window.frames[window.frames.length-1].Array
var arr = new xArray(1,2,3) // [1,2,3]

// 正確的判斷
Array.isArray(arr)  // true
// 有問題的判斷
arr instanceof Array // false
arr.constructor === Array // false 
思路三: Object.prototype.toString.call() 方法

適用于所有環境,只支持原生的對象,Object的toString()方法不能檢測非原生構造函數的構造函數名。開發人員自定義的任何構造函數都將返回[object Object]。在任何值上直接調用Object的原生toString()方法,都會返回[object NativeConstrctorName]格式的字符串,每個類內部都有一個class屬性,這個屬性中就指定了上述字符串中構造函數名。
 

    Object.prototype.toString.call(array) === "[object Array]"

不過,上面的方案也存在一定問題,在ES6 中這樣的判斷可以被欺騙

    var obj = {};
    // ES6 Symbol
    obj[Symbol.toStringTag] = "Array";
    // true
    console.log(isArray(obj)); 
結論

在ES5 之后,就老老實實用Array.isArray 來判斷,ES5之前可以使用上面pollyfill。

    if (!Array.isArray) {
        return Object.prototype.toString.call(array) === "[object Array]";
    }
結論延伸

以此延伸,那么判斷其他類型就可以使用類似的方法

    var is = function (obj,type) { 
        return (type === "Null" && obj === null) || 
            (type === "Undefined" && obj === void 0 ) || 
            (type === "Number" && isFinite(obj)) || 
            Object.prototype.toString.call(obj).slice(8,-1) === type; 
    }

參考:

1.Javascript isArray 數組類型檢測函數

2.JavaScript數組的isArray方法實現

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

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

相關文章

  • JavaScript中,如何判斷數組數組

    摘要:比如我們今天要討論的,在當中如何判斷一個數組是數組。在數組的原型鏈上也能找到構造函數由上面的幾行代碼可以看出,使用運算符可以分辨數組和對象,可以判斷數組是數組。用判斷實例化的數組擁有一個屬性,這個屬性指向生成這個數組的方法。 如果你沒有注意過這個問題,那么這個標題應該會讓你感到困惑,判斷數據類型這么基礎的問題能有什么坑呢? 少年,你不能太天真了,我們朝夕面對的這門語言,可是JavaSc...

    kohoh_ 評論0 收藏0
  • javascript判斷一個對象是否數組

    摘要:多個窗口意味著多個全局環境,不同的全局環境擁有不同的全局對象,從而擁有不同的內置類型構造函數。這可能會引發一些問題。上面我們提到使用原生的方法來判斷值是否為數組的實例。這也意味著不是一個十分可靠的識別對象類型的方式。 在JavaScript中,可以通過typeof操作符來判斷基本數據類型(Undefined、Null、Boolean、Number和String),同時相信大家也熟知ty...

    BearyChat 評論0 收藏0
  • javascript 判斷變量是否數組(Array)

    摘要:過完春節又有好多人尋找新的機會,旁邊的人面試完就會分享一些問題,明明會的但是面試的時候,想不全,面試官不滿意這個懊惱的行為,今天的文章跟大家分享下如何判斷便是是數組。 過完春節又有好多人尋找新的機會,旁邊的人面試完就會分享一些問題,明明會的但是面試的時候,想不全,面試官不滿意...這個懊惱的行為,今天的文章跟大家分享下:javascript如何判斷便是是數組。 1. typeof真的那...

    lyning 評論0 收藏0
  • javascript 判斷變量是否數組(Array)

    摘要:過完春節又有好多人尋找新的機會,旁邊的人面試完就會分享一些問題,明明會的但是面試的時候,想不全,面試官不滿意這個懊惱的行為,今天的文章跟大家分享下如何判斷便是是數組。 過完春節又有好多人尋找新的機會,旁邊的人面試完就會分享一些問題,明明會的但是面試的時候,想不全,面試官不滿意...這個懊惱的行為,今天的文章跟大家分享下:javascript如何判斷便是是數組。 1. typeof真的那...

    RayKr 評論0 收藏0
  • javascript 判斷變量是否數組(Array)

    摘要:過完春節又有好多人尋找新的機會,旁邊的人面試完就會分享一些問題,明明會的但是面試的時候,想不全,面試官不滿意這個懊惱的行為,今天的文章跟大家分享下如何判斷便是是數組。 過完春節又有好多人尋找新的機會,旁邊的人面試完就會分享一些問題,明明會的但是面試的時候,想不全,面試官不滿意...這個懊惱的行為,今天的文章跟大家分享下:javascript如何判斷便是是數組。 1. typeof真的那...

    RichardXG 評論0 收藏0

發表評論

0條評論

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