2014-05-03 37 views
1

我正在查找如何檢查JavaScript中的變量是否爲數組,但隨着SO頁面加載,我想到了解決問題的辦法。通過回答,我發現他們都沒有想到這個簡單的答案:只需檢查我們需要在數組上使用的方法,以便它仍然適用於實現相同方法的任何用戶定義類型。作爲一名有幫助的人,我想我會爲將來的人提交我的答案,試圖解決同樣的問題。但是經過測試,我發現它不起作用。當對象可能是字符串時使用'in'

function print(object) { 
    if ('map' in object) { // If the object implements map, treat it like an array 
    object.map(function(current) { 
     console.log(current); 
    }); 
    } else {    // Otherwise, treat it as a string 
    console.log(object); 
    } 
} 

現在,這個工作正常,當我用數組調用它,但如果我使用一個字符串失敗。由於字符串是javascript中的對象,爲什麼'in'關鍵字不能爲它們工作?有沒有什麼辦法可以實現這一點,就像現在一樣簡單?

+0

這樣做:'if(「map」in Object(object)){...'任何原語都將被轉換爲它的對象包裝類型。 –

+0

^^這很簡單,我喜歡。 – kennycoc

+0

我必須說,有更可靠的是看是否一個對象是一個數組。 –

回答

0

您可以訪問屬性和測試它的類型:

if (object != null && typeof object.map === 'function') 
    object.map(...); 
// ... 

由於字符串是在JavaScript對象,爲什麼不爲他們「在」關鍵字的工作?

不太。 primitive string valueString instance object之間有區別。

typeof "foo";  // "string" 
typeof new String(); // "object" 

原始值沒有屬性本身,這就是爲什麼他們使用時in運營商拋出Error。他們將,但是,被暫時屬性訪問盒裝入對象:

var a = "foo"; 
a.bar = 'bar';  // no error, but... 
console.log(a.bar); // undefined 

String.prototype.baz = function() { 
    return this + this; 
}; 

console.log(a.baz()); // "foofoo" 
0

我想你可以做這樣的事情:

var y = function (o) { 
    if (typeof o != "string" && "map" in o) 
     console.log("not a string"); //your code here 
    else 
     console.log("It's a string!"); //your code here 
} 

var x = "hello"測試這和它的工作。因爲&&在JavaScript中短路,它將停止在typeof o != "string",這很好,因爲"map" in o因爲string而失敗。注意有意使用小寫,這是用於基元的; String s是對象。我不確定這是否是你的目標。

相關問題