更好地检查JavaScript变量的完整性
Better sanity check for JavaScript variable
所以,我有一个模块化组件…这意味着它可能出现在多个应用程序中。这些都是内部的,所以当我们添加更多的产品时,组件的行为可以"增长"。
总的来说,可能有更好的设计来完成我想要完成的任务,但为了快速开发,我这样做:
function someFunc(opt) {
if(typeof(taEnvironment) !== "undefined")) {
if(taEnvironment === "webApp") {
// do stuff when a variable taEnvironment exists and its value is "webapp"
}
}
}
每次我需要检查"webApp"时都要这样做,所以我想把它抽象一点。建议的重构看起来像这样:
function someFunc(opt) {
if(environment("webApp")) {
// do stuff when a variable taEnvironment exists and its value is "webapp"
}
}
//...elsewhere in the same module...
function environment(env) {
var envSet = false;
if(typeof(env) === "undefined") {
return envSet;
}
if(typeof(taEnvironment) !== "undefined")) {
if(taEnvironment === env) {
envSet = true;
}
return envSet;
}
部分问题:
即使只看第一个未重构的代码片段;这是检查这些变量的常用方法吗?您不能将typeof检查与值检查结合起来,因为如果它未定义,则值检查将失败。首先我检查typeof是否有"undefined"然后嵌套在里面,检查值。这似乎是唯一的方法,但如果有更好的模式,我洗耳恭听!
取决于#1的答案——如果#1是一种合理的或预期的做事方式,提议的重构是否有意义?或者我没有创造任何显著的效率?
可以同时检查所有条件。&&
运算符将在第一个false
结果处停止:
function environment(env) {
return typeof taEnvironment !== 'undefined' &&
taEnvironment === env;
}
这是有道理的,尽管您可以采取一些步骤使后代更容易。
当一个可重用的函数返回一个布尔值时,您可以通过将该函数以问题的形式(例如isEnvironment(x)
)而不是仅仅是模棱两可的environment(x)
您还可以通过只返回条件taEnvironment === env
的求值来简化函数本身,而不是设置一个变量然后返回该变量。
这是你的函数的清理版本:
function isEnvironment(env) {
if(typeof taEnvironment === "undefined") {
return false;
}else{
return taEnvironment === env;
}
}
这是检查这些变量的常用方法吗?
是的。
提议的重构有意义吗?
是的。您也可以使用try...catch
,但这完全取决于您:
function environment(env) {
try {
return typeof env !== 'undefined' && taEnvironment === env;
} catch (e) {
return false;
}
}
注意:typeof
不是一个函数,它是一个运算符
我最近也从hasOwnProperty中获得了里程,当我想检查的"变量"本身不是一个离散变量,而是一个对象的预期属性。
那么,给定某种标志对象:
flags = {
appStarted: true,
userAuthenticated: true
}
我可能需要看看用户是否做了什么。我可以将对象初始化为具有thingDone: false
,然后在条件中检查是否为真;或者我可以简单地不初始化默认值,并检查它是否已设置:
if (flags.hasOwnProperty("thingDone")
这个答案超出了原来问题的范围(这是专门关于检查变量的),但它可能对那些本来会检查if(typeof flags.thingDone === "undefined")
的人有用。这是一件事的六件事,但我个人认为这在语义上更有意义。
- 将函数的上下文应用于javascript变量
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- 将PHP变量传递给jQuery时遇到问题
- 如何通过ajax刷新JSF填充的javascript变量
- 参数变量出现ngTable指令问题
- 通过javascript重定向html传递php变量
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 全局变量和全局对象的属性之间有什么区别吗
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 值对象在某个变量发生更改后发生更改
- Javascript变量赋值|
- AngularJS-在JSON选择器中使用变量名
- Javascript计数器变量未显示正确的值
- delete关键字在全局变量上的不同行为
- 如何在php变量中嵌入JQuery代码
- ReactJS映射:如何仅在url变量不为空时呈现html链接
- 在javascript函数中设置全局变量
- 将变量传递给外部Javascript
- 更好地检查JavaScript变量的完整性