2013-07-24 38 views
0

我想知道是否有經典的替代品。Javascript控制許多類型與「typeof」沒有「如果」

if (typeof firstPost === 'object' && typeof firstPost.active === 'boolean' && typeof firstPost.message === 'string' && typeof firstPost.maxHeight) 

爲了避免編寫更多的代碼,可能會循環對象。

+3

寫更少的代碼不應該是目標。編寫乾淨,清晰,可維護和可測試的代碼應該是目標。 – PeeHaa

回答

0

如果總是有相同的類型,並且你需要更精確的話,那麼你可以將它包裝在一個函數中。 否則你的if構造是你想象的唯一可能性。當然,你可以使用key作爲字段名和值作爲所需的類型來創建一個對象,但是我不會這麼做,因爲它不再易於閱讀。

是我腦海

唯一會縮短這個代碼(一點點),被包裹的typeof功能弄成這個樣子:

function is(variable, type){ 
    return typeof variable == type; 
} 

所以你也可以把它像is(firstPost, 'object')

0

循環對象或使用其他方式的代碼將比您寫的代碼多。 當然你可以使用「||」方法來比較在JavaScript或類型的「?:」if else語句。

0

第一次檢查可以簡化,因爲對象實例是truthy !!{} === true,並且您不需要特別檢查對象,因爲您正在檢查它是否稍後具有屬性。

而且大多數時候,你只需要知道,如果有對象內部的數據,準確地而不是是否是特定類型的:

function notUndef (aux) { 
return aux !== undefined; 
} 

if (firstPost && notUndef(firstPost.active) && notUdenf(firstPost.message) && notUndef(firstPost.maxHeight)) 

如果你有一個很長的屬性列表來檢查您可以使用循環:

function checkHasProps (obj, properties) { 
    obj || return false; 
    var hasAll = true; 
    properties.forEach(function (prop) { 
    if (obj[prop] === undefined) { 
     hasAll = false; 
    } 
    }); 
    return hasAll; 
} 

if (checkHasProps(['active', 'message', 'maxHeight', (...)])); 

記住,typeof [] === 'object',所以typeof是不檢查的東西完全地可靠的方法。如果這是用戶輸入

var firstPost = { 
    active : true, 
    message : "hello", 
    maxHeight : 20 
} 

然後

var checks = { 
    active : 'boolean', 
    message : 'string', 
    maxHeight : 'number' 
} 

try { 
    for(var key in checks) { 
     if(typeof firstPost[key] != checks[key]) { 
      throw new Error(key + " is not " + checks[key]); 
     } 
    } 
}catch(e) { 
    alert(e.toString()); 
} 

這不是bytesless,但它更乾淨

2

我會用這個。 (並且它還檢查是否所有鍵都被定義)

編輯: 沒有辦法更緊湊。但是你可以在另一個地方聲明一些函數並調用它。

function checkObject(obj,checks) { 
    for(var key in checks) { 
     if(typeof obj[key] != checks[key]) { 
      return false; 
     } 
    } 
    return true; 
} 

,只是

checkObject(firstPost,{ 
    active : 'boolean', 
    message : 'string', 
    maxHeight : 'number' 
}); 

您可以以指定錯誤闡述另一種返回類型。

+0

你應該拋出''或'返回false',而不是兩者。 try-catch-clause是不必要和緩慢的。 – Bergi

+0

@Bergi你是對的。謝謝。我正在考慮其他一些事情,並且我迷失了自我:-) –