JS编程建议——26:小心if嵌套的思维陷阱

建议26:小心if嵌套的思维陷阱
人的思维是非常复杂的,这在一定程度上会增加if结构嵌套的复杂性。假设有4个条件,只有当这些条件全部成立时,才允许执行某件事情。遵循人的一般思维习惯,在检测这些条件时,常常会沿用下面这种结构嵌套:

  1. if(a){
  2. if(b){
  3. if(c){
  4. if(d){
  5. alert("所有条件都成立!");
  6. }
  7. else{
  8. alert("条件d不成立!");
  9. }
  10. }
  11. else{
  12. alert("条件c不成立!");
  13. }
  14. }
  15. else{
  16. alert("条件b不成立!");
  17. }
  18. }
  19. else{
  20. alert("条件a不成立!");
  21. }
    从思维的方向性上来考虑,这种结构嵌套并没有错误,使用下面这个if结构来表示更为简单。
  22. if(a && b && c && d){
  23. alert("所有条件都成立!");
  24. }
    从设计时的本意来考虑:使用if语句逐个验证每个条件的合法性,并且对某个条件是否成立进行提示,以方便跟踪每个条件。但是,如果使用了上面的if结构多重嵌套,就会出现另一种可能: a条件不成立,程序会自动退出整个嵌套结构,而不管b、c和d的条件是否成立。这种“武断”很容易给测试带来“伤害”。如果核心的处理过程包含多条语句,或者出错的情况处理更为复杂,层层包裹的if结构会使代码嵌套过深,难以编辑。 为避免上述情况的发生,一般采取排除法,即对每个条件进行排除,条件全部成立再执行特定的操作。为了能够把条件有机地联系在一起,这里使用了一个布尔型变量作为钩子把每个if条件结构串在一起。
  25. var t = true; // 初始化行为变量为true
  26. if(!a){
  27. alert("条件a不成立!");
  28. t = false;
  29. }
  30. if(!b){
  31. alert("条件b不成立!");
  32. t = false;
  33. }
  34. if(!c){
  35. alert("条件c不成立!");
  36. t = false;
  37. }
  38. if(!d){
  39. alert("条件d不成立!");
  40. t = false;
  41. }
  42. if(t){
  43. alert("所有条件都成立!");
  44. }
    排除法有效地避免了条件结构的多重嵌套,并且更加符合人的思维模式。当然,这种设计方法也存在一定的局限性,一旦发生错误,就要放弃后面的操作。如果仅为了检查某个值的合法性,也就无所谓了。如果为了改变变量值和数据操作等,那么直接放弃就会导致后面的数据操作无法进行,为了防止此类问题的发生,不妨再设计一个标志变量来跟踪整个操作行为。
时间: 2024-11-05 18:47:19

JS编程建议——26:小心if嵌套的思维陷阱的相关文章

JS编程建议——45:警惕嵌套量词和回溯失控

建议45:警惕嵌套量词和回溯失控嵌套量词总是需要额外的关注和小心,以确保没有掩盖回溯失控问题.嵌套量词出现在一个自身被重复量词修饰的组中.嵌套量词本身并不会造成性能危害,只是在尝试匹配字符串过程中,很容易不小心在内部量词和外部量词之间,产生一大堆分解文本的方法.例如,要匹配HTML 标签,使用了下面的正则表达式:/<(?:1|"2"|'3')*>/这也许过于简单,因为它不能正确地处理所有情况的有效和无效标记,但在处理有效HTML 片段时应该没什么问题.与更加简单的/<

JS编程建议——27:小心if隐藏的Bug

建议27:小心if隐藏的Bug很多程序员都犯过这样低级的错误: if(a = 1){ alert(a); } 把比较运算符(==)错写为赋值运算符(=).这样的Bug一般很难发现,由于它是一个合法的表达式,不会导致编译错误.由于此表达的返回值为非0数值, JavaScript会自动把它转换为true,因此这样的分支结构的条件永远成立. 为了防止出现这样低级而又令人讨厌的错误,建议在条件表达式的比较运算中,把常量写在左侧,把变量写在右侧,这样即使把比较运算符(==)错写为赋值运算符(=),也会导致

JS编程建议——53:小心使用数组维度

建议53:小心使用数组维度在JavaScript中,数组在默认状态下是不会初始化的.如果使用[]运算符创建一个新数组,那么此数组将是空的.如果访问的是数组中不存在的元素,则得到的值将是undefined.因此,在JavaScript程序设计中应该时刻考虑这个问题:在尝试读取每个元素之前,都应该预先设置它的值.但是,如果在设计中假设每个元素都从一个已知的值开始(如0),那么就必须预定义这个数组.我们也可以为JavaScript自定义一个静态函数:Array.dim = function(dimen

JS编程建议——2:正确辨析JavaScript句法中的词、句和段

建议2:正确辨析JavaScript句法中的词.句和段JavaScript语法包含了合法的JavaScript代码的所有规则和特征,它主要分为词法和句法.词法包括字符编码.名词规则.特殊词规则等.词法侧重语言的底层实现(如语言编码问题等),以及基本规则的定义(如标识符.关键字.注释等).它们都不是最小的语义单位,却是构成语义单位的组成要素.例如,规范字符编码集合.命名规则.标识符.关键字.注释规则.特殊字符用法等.句法定义了语言的逻辑和结构,包括词.句和段的语法特性,其中段体现逻辑的结构,句表达

JS编程建议——3:减少全局变量污染

建议3:减少全局变量污染定义全局变量有3种方式:在任何函数外面直接执行var语句. var f = 'value'; 直接添加一个属性到全局对象上.全局对象是所有全局变量的容器.在Web浏览器中,全局对象名为window. window.f = 'value'; 直接使用未经声明的变量,以这种方式定义的全局变量被称为隐式的全局变量. f = 'value'; 为方便初学者在使用前无须声明变量而有意设计了隐式的全局变量,然而不幸的是忘记声明变量成了一个非常普遍的现象.JavaScript的策略是让

JS编程建议——8:谨慎使用运算符(2)

建议8:谨慎使用运算符(2)++和--运算符只能够作用于变量.数组元素或对象属性.下面的用法是错误的. 4++; 正确的用法如下: var n = 4; n++; ++和--运算符的位置不同所得运算结果也不同.例如,下面的递增运算符是先执行赋值运算,然后再执行递加运算. var n = 4; n++; // 4 而下面的递增运算符是先执行递加运算,再进行赋值运算. var n = 4; ++n; 3.小心逗号运算符 逗号在JavaScript语言中表示连续运算,并返回最后运算的结果.例如,在下面

JS编程建议——8:谨慎使用运算符(1)

建议8:谨慎使用运算符(1)1.用===,而不用==JavaScript有两组相等运算符:===和!==.==和!=.===和!==这一组运算符会按照期望的方式工作.如果两个运算数类型一致且拥有相同的值,那么===返回true,而!==返回false.==和!=只有在两个运算数类型一致时才会做出正确的判断,如果两个运算数是不同的类型,会试图强制转换运算数的类型.转换的规则复杂且难以记忆,具体规则如下: '' == '0' // false 0 == '' // true 0 == '0' //

JS编程建议——17:块标志并非多余

建议17:块标志并非多余if.while.do或for语句可以接受一个括在大括号中的代码块,也可以接受单行语句.单行语句的形式是另一种"带刺的玫瑰".它的好处是可以节省两个字节,但是它模糊了程序的结构,在随后的操作中可能产生问题,例如: if(0) if(1) alert(1); else alert(0); 如果不借助代码版式,很难明白以上代码的逻辑结构.而JavaScript解释器会根据if关键字与else关键字最近原则按如下结构进行解释. if(0) if(1) alert(1)

JS编程建议——24:优化if逻辑(1)

建议24:优化if逻辑(1)逻辑顺序体现了人的思维的条理性和严密性.合理的顺序可以提升解决问题的品质,相反,混乱的顺序很容易导致各种错误的发生.在分支结构中经常需要面临各种优化逻辑顺序的问题.人在思考问题时,一般总会对各种最可能发生的情况做好准备,这叫做"有备而来".分支结构中各种条件根据情况的先后.轻重来排定顺序.如果把最可能的条件放在前面,把最不可能的条件放在后面,这样程序在执行时总会按照代码先后顺序逐一检测所有条件,直到发现匹配的条件时才停止继续检测.如果把最可能的条件放在前面,