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

建议6:正确处理JavaScript特殊值(1)
1.正确使用NaN和Infinity
NaN是IEEE 754中定义的一个特殊的数量值。它不表示一个数字,尽管下面的表达式返回的是true。

  1. typeof NaN === 'number' // true
    该值可能会在试图将非数字形式的字符串转换为数字时产生,例如:
    • '0' // 0
    • 'oops' // NaN
      如果NaN是数学运算中的一个运算数,那么它与其他运算数的运算结果就会是NaN。如果有一个表达式产生出NaN的结果,那么至少其中一个运算数是NaN,或者在某个地方产生了NaN。

可以对NaN进行检测,但是typeof不能辨别数字和NaN的区别,并且NaN不等同于它自己,所以,下面的代码结果令人惊讶。

  1. NaN === NaN // false
  2. NaN !== NaN // true
    为了方便检测NaN值,JavaScript提供isNaN静态函数,以辨别数字与NaN区别。
  3. isNaN(NaN) // true
  4. isNaN(0) // false
  5. isNaN('oops') // true
  6. isNaN('0') // false
    判断一个值是否可用做数字的最佳方法是使用isFinite函数,因为它会筛除掉NaN和Infinity。Infinity表示无穷大。当数值超过浮点数所能够表示的范围时,就要用Infinity表示。反之,负无穷大为–Infinity。

使用isFinite函数能够检测NaN、正负无穷大。如果是有限数值,或者可以转换为有限数值,那么将返回true。如果只是NaN、正负无穷大的数值,则返回false。
不幸的是,isFinite会试图把它的运算数转换为一个数字。因此,如果值不是一个数字,使用isFinite函数就不是一个有效的检测方法,这时不妨自定义isNumber函数。

  1. var isNumber = function isNumber(value) {
  2. return typeof value === 'number' && isFinite(value);
  3. }
    2.正确使用null和undefined

JavaScript有5种基本类型:String、Number、Boolean、Null和Undefined。前3种都比较好理解,后面两种就稍微复杂一点。Null 类型只有一个值,就是null;Undefined类型也只有一个值,即undefined。 null 和undefined都可以作为字面量在 JavaScript 代码中直接使用。
null与对象引用有关系,表示为空或不存在的对象引用。当声明一个变量却没有向它赋值的时候,它的值就是undefined。undefined的值会在如下情况中出现:
从一个对象中获取某个属性,如果该对象及其prototype链中的对象都没有该属性,该属性的值为undefined。
一个函数如果没有显式通过return语句将返回值返回给其调用者,其返回值就是undefined,但在使用new调用函数时例外。
JavaScript的函数可以声明任意多个形参,当该函数实际被调用时,传入的参数的个数如果小于声明的形式参数的个数,那么多余的形式参数的值为undefined。
如果对值为null的变量使用typeof检测,得到的结果是“object”,而typeof undefined的值为“undefined”。null == undefined, null !== undefined。

时间: 2024-10-23 05:01:29

JS编程建议——6:正确处理JavaScript特殊值(1)的相关文章

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

建议4:注意JavaScript数据类型的特殊性(1)1.防止浮点数溢出二进制的浮点数不能正确地处理十进制的小数,因此0.1+0.2不等于0.3. num = 0.1+0.2; //0.30000000000000004 这是JavaScript中最经常报告的Bug,并且这是遵循二进制浮点数算术标准(IEEE 754)而导致的结果.这个标准适合很多应用,但它违背了数字基本常识.幸运的是,浮点数中的整数运算是精确的,所以小数表现出来的问题可以通过指定精度来避免.例如,针对上面的相加可以这样进行处理

JS编程建议——5:防止JavaScript自动插入分号

建议5:防止JavaScript自动插入分号JavaScript语言有一个机制:在解析时,能够在一句话后面自动插入一个分号,用来修改语句末尾遗漏的分号分隔符.然而,由于这个自动插入的分号与JavaScript语言的另一个机制发生了冲突,即所有空格符都被忽略,因此程序可以利用空格格式化代码.这两种机制的冲突,很容易掩盖更为严重的解析错误.有时会不合时宜地插入分号.例如,在return语句中自动插入分号将会导致这样的后果:如果return语句要返回一个值,这个值的表达式的开始部分必须和return在

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编程建议——2:正确辨析JavaScript句法中的词、句和段

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

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

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

JS编程建议——78:正确理解执行上下文和作用域链

建议78:正确理解执行上下文和作用域链执行上下文(execution context)是ECMAScript规范中用来描述 JavaScript 代码执行的抽象概念.所有的 JavaScript 代码都是在某个执行上下文中运行的.在当前执行上下文中调用 function会进入一个新的执行上下文.该function调用结束后会返回到原来的执行上下文中.如果function在调用过程中抛出异常,并且没有将其捕获,有可能从多个执行上下文中退出.在function调用过程中,也可能调用其他的functi

JS编程建议——41:正确使用正则表达式引用

建议41:正确使用正则表达式引用正则表达式在执行匹配运算时会自动把每个分组(子表达式)匹配的文本都存储在一个特殊的地方以备将来使用.这些存储在分组中的特殊值被称为反向引用.反向引用将遵循从左到右的顺序,根据表达式中左括号字符的顺序进行创建和编号.var s = "abcdefghijklmn";var r = /(a(b(c)))/;var a = s.match(r); //["abc", "abc" , "bc" , &q

JS编程建议——40:正确使用正则表达式分组(2)

建议40:正确使用正则表达式分组(2)当然,并不限制在分组后使用星号,还可以使用任意重复类数量词: var r = /(abcdef-?){5}/; // 连续匹配5次子表达式 var r = /(abcdef-?){1,5}/; // 最多匹配5次子表达式 var r = /(abcdef-?){0,}/; // 匹配任意次子表达式 var r = /(abcdef-?)?/; // 最多匹配一次子表达式 var r = /(abcdef-?)+/; // 最小匹配一次子表达式 如果混合使用字