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

建议27:小心if隐藏的Bug
很多程序员都犯过这样低级的错误:

  1. if(a = 1){
  2. alert(a);
  3. }
    把比较运算符(==)错写为赋值运算符(=)。这样的Bug一般很难发现,由于它是一个合法的表达式,不会导致编译错误。由于此表达的返回值为非0数值, JavaScript会自动把它转换为true,因此这样的分支结构的条件永远成立。

为了防止出现这样低级而又令人讨厌的错误,建议在条件表达式的比较运算中,把常量写在左侧,把变量写在右侧,这样即使把比较运算符(==)错写为赋值运算符(=),也会导致编译错误,因为常量是不能够被赋值的,从而能够即时发现这个Bug。例如:

  1. if(1 == a){
  2. alert(a);
  3. }
    下面这个错误也是很容易发生的:
  4. var a=2;
  5. if(1 == a);
  6. {
  7. alert(a);
  8. }
    当在条件表达式后错误地附加一个分号时,整个条件结构的逻辑就发生了根本的变化。用代码来描述上面结构的逻辑如下:
  9. var a=2;
  10. if(1 == a)
  11. ;
  12. {
  13. alert(a);
  14. }
    也就是说,JavaScript会把条件表达式之后的分号视为一个空语句,从而改变了原来设想的逻辑。因此,要避免这样的低级错误,应该牢记条件表达式之后不允许使用分号,当然也可以通过把大括号与条件表达式书写在一行内来防止疏忽。
  15. var a=2;
  16. if(1 == a){
  17. alert(a);
  18. }
时间: 2024-08-31 08:33:02

JS编程建议——27:小心if隐藏的Bug的相关文章

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

建议26:小心if嵌套的思维陷阱人的思维是非常复杂的,这在一定程度上会增加if结构嵌套的复杂性.假设有4个条件,只有当这些条件全部成立时,才允许执行某件事情.遵循人的一般思维习惯,在检测这些条件时,常常会沿用下面这种结构嵌套: if(a){ if(b){ if(c){ if(d){ alert("所有条件都成立!"); } else{ alert("条件d不成立!"); } } else{ alert("条件c不成立!"); } } else{

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

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

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

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

JS编程建议——65:比较函数的惰性求值与非惰性求值

建议65:比较函数的惰性求值与非惰性求值在JavaScript中,使用函数式风格编程时,应该对于表达式有着深刻的理解,并能够主动使用表达式的连续运算来组织代码.1)在运算元中,除了JavaScript默认的数据类型外,函数也作为一个重要的运算元参与运算.2)在运算符中,除了JavaScript的大量预定义运算符外,函数还作为一个重要的运算符进行计算和组织代码.函数作为运算符参与运算,具有非惰性求值特性.非惰性求值行为自然会对整个程序产生一定的负面影响.先看下面这个示例:var a = 2;fun

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编程建议——29:准确使用循环体(1)

建议29:准确使用循环体(1)1.选择正确的循环体在大多数编程语言中,代码执行时间多数消耗在循环的执行上.在一系列编程模式中,循环是最常用的模式之一,因此也是提高性能必须关注的地方之一.理解JavaScript 中循环对性能的影响至关重要,因为死循环或长时间运行的循环会严重影响用户体验.JavaScript定义了4种类型的循环:第一种循环是标准的for循环,与C语言使用同样的语法: for (var i=0; i < 10; i++){ //循环体 } for循环是最常用的循环结构,它由4部分组

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

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

JS编程建议——50:正确检测数组类型

建议50:正确检测数组类型由于数组和对象的数据同源性,导致在JavaScript编程中经常会出现:在必须使用数组时使用了对象,或者在必须使用对象时使用了数组.选用数组或对象的规则很简单:当属性名是小而连续的整数时,应该使用数组,或者当对属性的位置和排列顺序有要求时,应该使用数组.否则,使用对象.JavaScript语言对数组和对象的区别是混乱的.typeof运算符检测数组的类型是"object",这没有什么意义,因此在正确检测数组和对象方面JavaScript没有提供很多的机制.这时可