有时候,我必须检查许多存在和定义的变量。看起来像这样:
if (typeof store.part.items !== 'undefined' &&
typeof domain !== 'undefined' &&
typeof tab.partId !== 'undefined')
{
// do something useful
}
编写这种结构很无聊,每次都需要大量敲击键盘,并且增加了出错的风险。如何解决这个问题?
答案 0 :(得分:8)
您可以使用rest parameter syntax来收集作为数组传递给函数的所有参数。然后,使用every
检查它们是否都是未定义
const defined = (...values) => values.every(v => typeof v !== "undefined")
或按照@Ry的建议使用includes
const defined = (...values) => !values.includes(undefined)
调用函数时,无需创建数组。您只需使用任意数量的参数即可调用它:
defined(store.part.items, domain, tab.partId)
答案 1 :(得分:1)
这是一个对我有很大帮助的小功能。
const defined = function (value) {
const resFunc = (val) => typeof val !== 'undefined';
if (Array.isArray(value)) {
let res = true;
value.forEach(el => res = res && resFunc(el));
return res;
}
return resFunc(value);
}
现在我的代码看起来更开心和可读:
if (defined([store.part.items, domain, tab.partId])) {
// do something useful
}
答案 2 :(得分:1)
使用arguments
进行变量参数计数,使用简单的旧for
循环并提前退出以提高性能来优化OP的自回答:
const defined = function(...arguments) {
for (let i = 0; i < arguments.length; i++) {
if (arguments[i] === undefined) return false;
}
return true;
};
// ...
if (defined(store.part.items, domain, tab.partId)) {
// do something useful
}
if (defined(store.part.items) {
// do something useful
}
答案 3 :(得分:1)
除了定义自己的函数(您已经做过)之外,没有捷径可做。我想改善您对该功能的实现。
defined(exprs: array<any> | any, all?: bool)
exprs
—检查表达式是否未定义的表达式。
all
-表达式是否必须相同。 [如果有用,exprs: array<any>
]function defined(exprs, all=true) { if(Array.isArray(exprs)) { if(all) return exprs.every(exp => typeof exp !== "undefined"); else return exprs.some(exp => typeof exp !== "undefined"); } else typeof exprs !== "undefined"; }