我想知道是否有經典的替代品。Javascript控制許多類型與「typeof」沒有「如果」
if (typeof firstPost === 'object' && typeof firstPost.active === 'boolean' && typeof firstPost.message === 'string' && typeof firstPost.maxHeight)
爲了避免編寫更多的代碼,可能會循環對象。
我想知道是否有經典的替代品。Javascript控制許多類型與「typeof」沒有「如果」
if (typeof firstPost === 'object' && typeof firstPost.active === 'boolean' && typeof firstPost.message === 'string' && typeof firstPost.maxHeight)
爲了避免編寫更多的代碼,可能會循環對象。
如果總是有相同的類型,並且你需要更精確的話,那麼你可以將它包裝在一個函數中。 否則你的if構造是你想象的唯一可能性。當然,你可以使用key作爲字段名和值作爲所需的類型來創建一個對象,但是我不會這麼做,因爲它不再易於閱讀。
是我腦海唯一會縮短這個代碼(一點點),被包裹的typeof功能弄成這個樣子:
function is(variable, type){
return typeof variable == type;
}
所以你也可以把它像is(firstPost, 'object')
等
循環對象或使用其他方式的代碼將比您寫的代碼多。 當然你可以使用「||」方法來比較在JavaScript或類型的「?:」if else語句。
第一次檢查可以簡化,因爲對象實例是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,但它更乾淨
我會用這個。 (並且它還檢查是否所有鍵都被定義)
編輯: 沒有辦法更緊湊。但是你可以在另一個地方聲明一些函數並調用它。
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'
});
您可以以指定錯誤闡述另一種返回類型。
你應該拋出''或'返回false',而不是兩者。 try-catch-clause是不必要和緩慢的。 – Bergi
@Bergi你是對的。謝謝。我正在考慮其他一些事情,並且我迷失了自我:-) –
寫更少的代碼不應該是目標。編寫乾淨,清晰,可維護和可測試的代碼應該是目標。 – PeeHaa