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

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

  1. var f = function(){
  2. return
  3. {
  4. status: true
  5. };
  6. }
    看起来这里要返回一个包含status成员元素的对象。不幸的是,JavaScript自动插入分号让它返回了undefined,从而导致下面真正要返回的对象被忽略。

当自动插入分号导致程序被误解时,并不会有任何警告提醒。如果把{放在上一行的尾部而不是下一行的头部,就可以避免该问题,例如:

  1. var f = function(){
  2. return {
  3. status: true
  4. };
  5. }
    为了避免省略分号引起的错误,建议养成好的习惯,不管一行内语句是否完整,只要是完整的语句都必须增加分号以表示句子结束。

为了方便阅读,当长句子需要分行显示时,在分行时应确保一行内不能形成完整的逻辑语义。例如,下面代码是一条连续赋值的语句,通过分行显示可以更清楚地查看它们的关系。这种分行显示,由于一行内不能形成独立的逻辑语义,因此JavaScript不会把每一行视为独立的句子,从而不会产生歧义。

  1. var a =
  2. b =
  3. c = 4;
    以上语句在一行内显示如下:
  4. var a = b = c = 4;
    对于下面这条语句,如果不能正确分行显示,就很容易产生歧义。该句子的含义:定义一个变量i,然后为其赋值,如果变量a为true,则赋值为1,否则就判断变量b,如果b为true,则赋值为2,否则就判断变量c,如果c为true,则赋值为3,否则赋值为4。
  5. var i = a ? 1 : b ? 2 : c ? 3 : 4;
    下面的分行显示就是错误的,因为表达式a ? 1: b能够形成独立的逻辑语义,所以JavaScript会自动在其后添加分号来表示一个独立的句子。
  6. var i = a ? 1: b
  7. ? 2 : c
  8. ? 3 : 4;
    安全的方法应该采用如下的分行显示,这样每一行都不能形成独立的语义。
  9. var i = a ? 1
  10. : b ? 2
  11. : c ? 3
  12. : 4;
    总之,在编写代码时,应养成使用分号结束句子的良好习惯,凡是完整的句子就应该使用分号进行分隔。分行显示的句子应该确保单行不容易形成独立的合法的逻辑语义。
时间: 2024-07-30 02:25:47

JS编程建议——5:防止JavaScript自动插入分号的相关文章

防止JavaScript自动插入分号

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

如何防止JavaScript自动插入分号_javascript技巧

 在 JavaScript 中,行尾的分号有一种自动插入机制,这样子,可以容忍某些朋友忽略了输入分号. 当然你最好养成输入分号的习惯,同时掌握 JavaScript 是如何处理忽略输入分号的情况的,因为这种知识有助于你理解没有分号的代码. JavaScript语言有一个机制:在解析时,能够在一句话后面自动插入一个分号,用来修改语句末尾遗漏的分号分隔符.然而,由于这个自动插入的分号与JavaScript语言的另一个机制发生了冲突,即所有空格符都被忽略,因此程序可以利用空格格式化代码.     这两

JavaScript自动插入分号

自动分号插入 尽管 JavaScript 有 C 的代码风格,但是它不强制要求在代码中使用分号,实际上可以省略它们. JavaScript 不是一个没有分号的语言,恰恰相反上它需要分号来就解析源代码. 因此 JavaScript 解析器在遇到由于缺少分号导致的解析错误时,会自动在源代码中插入分号. var foo = function() { } // 解析错误,分号丢失 test() 自动插入分号,解析器重新解析. var foo = function() { }; // 没有错误,解析继续

JS教程:浅谈ECMAScript自动插入分号

javascript的分号代表语句的结束符,但由于javascript具有分号自动插入规则,所以它是一个十分容易让人模糊的东西,在一般情况下,一个换行就会产生一个分号,但实际情况却不然,也就是说在javascript中换行可能产生分号,也可能不产生,是否自动插入分号,主要看上下行.所以即使是经验丰富的程序员,有时候也会头大. 在 ECMAScript 中对分号自动插入规则也有相应的解释:空语句,变量语句,表达式语句,do-while 语句,continue 语句,break 语句,return

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

建议2:正确辨析JavaScript句法中的词.句和段JavaScript语法包含了合法的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编程建议——6:正确处理JavaScript特殊值(1)

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