2017-05-29 51 views
0

通常在使用JavaScript時會遇到一些愚蠢的問題。一個這樣的問題是在對象類型之間辨別。概念:在JavaScript中的陣列,僞陣列和對象之間進行區分

有沒有辦法用這個功能創建一個函數? 見下圖:

_discern = function() { [ function code ] }; 

_discern({}); // Logs: Object 

_discern([]); // Logs: Array 

_discern(document); // Logs: Pseudo-Object 

_discern(document.querySelectorAll("*")); // Logs: Pseudo-Array 

我已經嘗試過創建檢查數組相似的功能,但我所希望的,沒有工作的好:

isArrLike = function (_) { 

    _[0] = 0; return [].slice.call(_).length >= Object.values(_).length; 
}; 

而且我我已經嘗試將該行爲用於其他功能。所有失敗。有沒有辦法?

+0

如何定義「僞對象」?你的意思是[*異國情調的對象*](http://www.ecma-international.org/ecma-262/7.0/index.html#sec-exotic-object)?有[* host object *](http://www.ecma-international.org/ecma-262/5.1/index.html#sec-4.3.8)的概念,但它已被刪除。一個好的開始就是提供一個明確定義什麼測試或特徵定義了每種類型的對象。 – RobG

回答

1

看起來像你想知道的東西行爲像一個數組,而不是尋找實際的類型/構造函數。

如果是這樣的話,它應該是足夠check if something is iterable

function isIterable(obj) { 
    // checks for null and undefined 
    if (obj == null) { 
    return false; 
    } 
    return typeof obj[Symbol.iterator] === 'function'; 
} 
+0

你真了不起。 – imaxwill

+0

你對「迭代」的定義是什麼?數組方法適用於任何具有* length *屬性的對象,這足夠嗎? NodeList是「可迭代的」嗎?它當然是**可迭代的。 ;-) – RobG

0

所有這些都是對象:

  • 是陣列→ return x instanceof ArrayArray.isArray(x)
  • 是功能→ return typeof x === 'function'
  • 是HTML元素→ return x instanceof HTMLElement
  • 是平原對象→ return typeof x === 'object' && /* ... is not array, not function, not HTML element */
+0

'x instanceof Array'會跨越幀失敗,'x instanceof HTMLElement'會假設主機環境不一定受支持,typeof x ==='object''不是HTML元素或一些其他主機對象(在IE中嘗試它們)。 – RobG

0

由於Logain的回答,我可以解決這個問題。這是我的方法:

kind = function (a) { 

    let u = toString.call(a.valueOf()).slice(8, -1); 

    if (a == null || u == "String" || u == "Number" || u == "Boolean") { 

     return u; 
    } 

    else if (typeof a[Symbol.iterator] == "function") { 

     return u != "Array" ? "Array-Like" : u; 
    } 

    else { 

     return u; 
    } 
};