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

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

  1. var undefined;
  2. alert(undefined);
    如果浏览器不支持undefined关键字,可以自定义undefined变量,并将其赋值为undefined。例如:
  3. var undefined = void null;
    声明变量为undefined,将其初始化为表达式void null的值,由于运算符void在执行其后的表达式时会忽略表达式的结果值,而总是返回值undefined,因此利用这种方法可以定义一个变量为undefined,并将其赋值为undefined。既然是将变量undefined赋值为undefined,还可以使用如下方式:
  4. var undefined = void 1;
    或者使用没有返回值的函数:
  5. var undefined = function(){}();
  6. alert(undefined); //"undefined"
    可以使用typeof运算符来检测某个变量的值是否为undefined:
  7. var a;
  8. if(typeof a == "undefined"){
  9. }
    3.使用假值

JavaScript的类型系统是非常混乱的,类型特性不明显,而且交叉错乱。JavaScript语法系统拥有一大组假值,如以下代码所示。这些值的布尔值都是false。

  1. 0 //Number
  2. NaN //Number
  3. '' //String
  4. false //Boolean
  5. null //Object
  6. undefined //Undefined
    这些值全部都等同于false,但它们是不可互换的。例如,下面用法是错误的。
  7. value = myObject[name];
  8. if(value == null) {
  9. }
    这是在用一种错误的方式去确定一个对象是否缺少一个成员属性。undefined是缺失的成员属性值,而上面代码片段用null来测试,使用了会强制类型转换的==运算符,而不是更可靠的===运算符。正确的用法如下:
  10. value = myObject[name];
  11. if(!value) {
  12. }
    undefined和NaN并不是常见,它们是全局变量,还可以改变它们的值,虽然在程序设计中不应该采取这种做法,但可以改变它们的值。
时间: 2024-10-23 05:02:20

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

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特殊值(1)

建议6:正确处理JavaScript特殊值(1)1.正确使用NaN和InfinityNaN是IEEE 754中定义的一个特殊的数量值.它不表示一个数字,尽管下面的表达式返回的是true. typeof NaN === 'number' // true 该值可能会在试图将非数字形式的字符串转换为数字时产生,例如: '0' // 0 'oops' // NaN 如果NaN是数学运算中的一个运算数,那么它与其他运算数的运算结果就会是NaN.如果有一个表达式产生出NaN的结果,那么至少其中一个运算数是N

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-?)+/; // 最小匹配一次子表达式 如果混合使用字