簡體   English   中英

在Javascript中區分數組和“哈希”

[英]Differentiating between arrays and “hashes” in Javascript

為了使我的一個函數的語法更好,我需要能夠判斷一個特定的參數是一個數組還是“哈希”(我知道它只是對象)。

Typeof不起作用,因為它們都返回相同的東西

typeof {foo:"bar"} // Object

typeof ["foo","bar"] // Object

那么我如何區分這兩者呢?

我知道這有效 ,但我希望有更好的方法

({foo:"bar"}).constructor // Object()

(["foo","bar"]).constructor // [ undefined ]

編輯啊,似乎[firebug中的[undefined]與Array是一樣的。 有點奇怪。

你可以像SLaks建議的那樣檢查長度屬性,但是一旦你傳遞了一個函數對象,你就會感到驚訝,因為它實際上有一個length屬性。 此外,如果對象定義了一個length屬性,你將再次得到錯誤的結果。

你最好的選擇可能是:

function isArray(obj) {
    return Object.prototype.toString.call(obj) === "[object Array]";
}

jQuery使用它,還有一對“其他人”...... :)

它比實例方式更失敗。 以下文章還建議了該方法:

'instanceof'被認為是有害的(或者如何編寫一個強大的'isArray') (@ kagax)

另外要補充一點,這個函數幾乎與ES 5規范中的Array.isArray函數相同:

15.4.3.2 Array.isArray(arg)

  1. 如果Type( arg )不是Object,則返回false
  2. 如果arg的[[Class]]內部屬性的值是“Array” ,則返回true
  3. 返回false

something instanceof Array在單個文檔中工作正常,但如果您開始在不同窗口之間傳遞數組,則會失敗,因為一個窗口中的Array與另一個窗口中的Array不同。 如果你不打算做跨窗口腳本(一般來說,值得避免),我建議堅持這一點。

如果您需要跨窗口支持,事情就會復雜一些。 在未來,故事很簡單,因為ECMAScript第五版定義了一個函數來完成這個:

Array.isArray([1]);   // -> true

您應該使用此功能,因為它是唯一可靠且標准認可的方式。 但是,今天的許多瀏覽器還不支持它。

在它不可用的地方你必須依賴於Object#toString序列化,這是一種丑陋且略顯狡猾的。 雖然它通常可以與當今的瀏覽器一起可靠地工作,但是可以想象它可能不會(主要與宿主對象有關)。

您可以在不支持它的瀏覽器上將此回退方法破解為Array ,然后Array.isArray使用Array.isArray

if (!('isArray' in Array)) {
    Array.isArray= function(o) {
        return Object.prototype.toString.call(o)==='[object Array]';
    };
}

至於constructor ,永遠不要使用它。 它並非在任何地方都可用,它沒有按照您的想法行事。 使用它幾乎總是一個錯誤。

我認為最優雅的方法是簡單地使用instanceof運算符:

if (myVar instanceof Array)
    doSomething();

例子:

[] instanceof Array           // true
{} instanceof Array           // false
{length:100} instanceof Array // false
null instanceof Array         // false

編輯:

請注意,從另一個iFrame測試對象時它會失敗(請參閱@galambalazs和@bobince的答案)

檢查length屬性:

"length" in {foo:"bar"}   //false
"length" in ["foo","bar"] //true

此類型的函數用於更正typeof運算符的數組/對象碰撞以及 null / object碰撞。 但是它不能跨框架或跨窗口工作。 請參閱源代碼以獲取適用於這些版本的更高級版本。

function typeOf(value) {
    var s = typeof value;
    if (s === 'object') {
        if (value) {
            if (value instanceof Array) {
                s = 'array';
            }
        } else {
            s = 'null';
        }
    }
    return s;
}

資料來源: Douglas Crockford的Javascript網站

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM