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

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

  1. '' == '0' // false
  2. 0 == '' // true
  3. 0 == '0' // true
  4. false == 'false' // false
  5. false == '0' // true
  6. false == undefined // false
  7. false == null // false
  8. null == undefined // true
    上面表达式如果全部使用===运算符,则都会返回true。

==和!=运算符缺乏传递性,需要引起警惕。所谓传递性就是:如果a==b为true,b==c为true,则a==c也为true。因此,在JavaScript开发中,建议永远不要使用==和!=,而选用===和!==运算符。
下面分别介绍一下===和==运算符的算法。
(1)===运算符的算法
在使用===来判断两个值是否相等时,如判断x===y,会先比较两个值的类型是否相同,如果不相同,直接返回false。如果两个值的类型相同,则接着根据x的类型展开不同的判断逻辑:
如果x的类型是Undefined或Null,则返回 true。
如果x的类型是Number,只要x 或y中有一个值为NaN,就返回 false;如果x和y的数字值相等,就返回 true;如果x或y中有一个是+0,另外一个是–0,则返回 true。
如果x的类型是String,当x和y的字符序列完全相同时返回 true,否则返回 false。
如果x的类型是Boolean,当x和y同为true或false时返回 true,否则返回 false。
当x和y引用相同的对象时返回 true,否则返回 false。
(2)==运算符的算法
在使用==来判断两个值是否相等时,如判断x==y,如果x和y的类型一样,判断逻辑与=== 一样;如果x和y的类型不一样,==不是简单地返回false,而是会进行一定的类型转换。
如果x和y中有一个是 null,另外一个是undefined,返回true,如null == undefined。
如果x和y中有一个类型是String,另外一个类型是Number,会将String类型的值转换成 Number来比较,如3 == "3"。
如果x和y中有一个类型是Boolean,会将Boolean类型的值转换成Number来比较,如true == 1、true == "1"。
如果x和y中有一个类型是String或Number,另外一个类型是Object,会将Object类型的值转换成基本类型来比较,如[3,4] == "3,4"。
2.谨慎使用++和--
递增(++)和递减(--)运算符使程序员可以用非常简洁的风格去编码,如在C语言中,它们使得通过一行代码实现字符串的复制成为可能,例如:

  1. for (p = src, q = dest; !p; p++, q++) q = *p;
    事实上,这两个运算符容易形成一种不谨慎的编程风格。大多数的缓冲区溢出错误所造成的安全漏洞都是由于这种编码导致的。

当使用++和--时,代码往往变得过于紧密、复杂和隐晦。因此,在JavaScript程序设计中不建议使用它们,从而使代码风格变得更为整洁。

时间: 2024-09-10 10:12:09

JS编程建议——8:谨慎使用运算符(1)的相关文章

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

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

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

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

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

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

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

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

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

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

JS编程建议——4:注意JavaScript数据类型的特殊性(3)

建议4:注意JavaScript数据类型的特殊性(3)其中,object表示对象的通用类型,class表示对象的内部类型,内部类型的名称与该对象的构造函数名对应.例如,Array对象的class为"Array",Function对象的class为"Function",Date对象的class为"Date",内部Math对象的class为"Math",所有Error对象(包括各种Error子类的实例)的class为"E

JS编程建议——6:正确处理JavaScript特殊值(2)

建议6:正确处理JavaScript特殊值(2)与null不同,undefined不是JavaScript的保留字,在ECMAScript v3标准中才定义undefined为全局变量,初始值为undefined.因此,在使用undefined值时就存在一个兼容问题(早期浏览器可能不支持undefined).除了直接赋值和使用typeof运算符外,其他任何运算符对undefined的操作都会引发异常.不过,可以声明undefined变量,然后查看它的值,如果它的值为undefined,则说明浏览

JS编程建议——11:慎重使用伪数组

建议11:慎重使用伪数组JavaScript没有真正的数组,因此typeof运算符不能辨别数组和对象.伪数组在JavaScript中有很高的易用性,程序员不用给它设置维度,而且永远不用担心产生越界错误,但JavaScript数组的性能相比真正的数组可能更糟糕.要判断一个值是否为数组,必须使用constructor属性,例如: if(value && typeof value === 'object' && value.constructor === Array) { } a

JS编程建议——9:不要信任hasOwnProperty

建议9:不要信任hasOwnPropertyhasOwnProperty方法常被用做一个过滤器,用来消除for in语句在枚举对象属性时的弊端.考虑到hasOwnProperty是一个方法,而不是一个运算符,因此,在任何对象中,它可能会被一个不同的函数甚至一个非函数的值所替换.例如,在下面代码中, obj对象的hasOwnProperty成员被清空了,此时如果再利用这个方法来过滤出obj对象的本地属性就会失败. var obj={}, name; obj.hasOwnProperty = nul