如何防止JavaScript自动插入分号

在 JavaScript 中,行尾的分号有一种自动插入机制,这样子,可以容忍某些朋友忽略了输入分号。 当然你最好养成输入分号的习惯,同时掌握 JavaScript 是如何处理忽略输入分号的情况的,因为这种知识有助于你理解没有分号的代码。

JavaScript语言有一个机制:在解析时,能够在一句话后面自动插入一个分号,用来修改语句末尾遗漏的分号分隔符。然而,由于这个自动插入的分号与JavaScript语言的另一个机制发生了冲突,即所有空格符都被忽略,因此程序可以利用空格格式化代码。

这两种机制的冲突,很容易掩盖更为严重的解析错误。有时会不合时宜地插入分号。例如,在return语句中自动插入分号将会导致这样的后果:如果return语句要返回一个值,这个值的表达式的开始部分必须和return在同一行上,例如:

 var f = function(){
 return
 {
 status: true
 };
 }

看起来这里要返回一个包含status成员元素的对象。不幸的是,JavaScript自动插入分号让它返回了undefined,从而导致下面真正要返回的对象被忽略。

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

 var f = function(){
 return {
 status: true
 };
 }

为了避免省略分号引起的错误,建议养成好的习惯,不管一行内语句是否完整,只要是完整的语句都必须增加分号以表示句子结束。

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

 var a =
 b =
 c = 4;

以上语句在一行内显示如下: var a = b = c = 4;

对于下面这条语句,如果不能正确分行显示,就很容易产生歧义。该句子的含义:定义一个变量i,然后为其赋值,如果变量a为true,则赋值为1,否则就判断变量b,如果b为true,则赋值为2,否则就判断变量c,如果c为true,则赋值为3,否则赋值为4.

 var i = a ? 1 : b ? 2 : c ? 3 : 4;

下面的分行显示就是错误的,因为表达式a ? 1: b能够形成独立的逻辑语义,所以JavaScript会自动在其后添加分号来表示一个独立的句子。

 var i = a ? 1: b
 ? 2 : c
 ? 3 : 4;

安全的方法应该采用如下的分行显示,这样每一行都不能形成独立的语义。

 var i = a ? 1
 : b ? 2
 : c ? 3
 : 4;

总之,在编写代码时,应养成使用分号结束句子的良好习惯,凡是完整的句子就应该使用分号进行分隔。分行显示的句子应该确保单行不容易形成独立的合法的逻辑语义

PS:示例详解javascript自动在行尾添加分号

分号(;),通常会用在一行语句的结尾,代码如下:

var webName = "我们";
var url = www.jb51.net;

上面的代码,在每一个声明语句后面都添加了分号,这不用多解释。

var webName = "我们"
var url = www.jb51.net

其实分号也完全可以省略,但是省略的这个分号,会在编译阶段自动为其添加分号。
再来看一段代码实例:

function done(webName){
 return
 webName
}
console.log(done("我们"));

由于编译器会在每一行后面都自动添加了分号,所以输出值undefined,不是"我们"。

时间: 2015-11-04

走进javascript——不起眼的基础,值和分号

值 有时我很想知道javascript解析引擎是如何区分一个变量的值,比如下面这段代码. var x = 'javascript'; //javascript x = "hello"; // hello x = 555; //555 x = null; //null x = a; //a is not defined x = true; //true 对于数字是直接赋值的,因为它没有多样性,数字就是数字.但是对于值是英文的情况就很难区分了,因为在编程语言中,英文既可能是字符串,也可能是

浅谈javascript的分号的使用

JS中function 的开头有必要加分号吗?js语句后应该加分号吗? javascript大括号后面应使用分号吗?JS中function 的开头有加感叹号.分号是什么意思呢? Js多个文件集成成一个文件后,压缩代码时避免发生语法错误,可以如下处理 一.js 前加分号 例如:;(function($){...此处代码...})(); Javascript中分号表示语句结束,在开头加上,是为了压缩的时候和别的方法分割一下,表示一个新的语句开始 二.js函数后加分号 例如 // 模块1 // 前面有

JavaScript基本类型值-Number类型

大致介绍 在JavaScript的内部采用IEEE754格式来表示数字,所以不区分整数和浮点数,都是用64位浮点数的形式储存.就是说,在JavaScript内部,就根本没有小数.但是有些运算必须得需要整数完成,所以JavaScript有时会把64位的浮点数转换成32位的整数,再进行运算. 整数 JavaScript对整数提供四种表示方法: 1.二进制:有前缀0b的数值,出现0,1以外的数字会报错 2.八进制:有前缀0o的数值,或者是以0后面再跟一个数字(0-7).如果超出了前面所述的数值范围,则

js中关于一个分号的崩溃示例

复制代码 代码如下: if ($("span", $("#txtStere").siblings("div")).text() === "*"); { if (!IsNum("#txtStere")) { $("#txtStere").next().text("您选择的运费模板是按体积计价,物流体积不能为空且需是数字"); return false; } else {

JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)

看代码: HTML: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta htt

JavaScript基本类型值-Undefined、Null、Boolean

大致介绍 ECMAScript中有5中简单的数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String. Undefined Undefined时全局变量的一个属性,它只有一个值即:undefined.当使用var声明变量但未对其初始化时,这个变量的值就是undefined. var test; console.log(test); //undefined 对于未声明过的变量只能进行一种操作,即typeof检测其数据类型 //var a consol

JS 分号引起的一段调试问题

来看一下下面的代码: var a=textbox1.text; var b=5; if(a<b);//如果用户输入的值小于5,就取5 { a=b; } 看看执行后有什么效果,无论textbox1.text是什么值,都会时放条件判断.为什么呢.有没有什么发现. 原来在写代码的时候,if(a<b);这里多了个分号.一不小心犯的错,却花了不少时间来解决. 注:刚写下的经过,再次打开时,没有内容了.因此就精简一点了.写个大致意思了

浅析Javascript的自动分号插入(ASI)机制

前言 相信从事过C#和Java的大家都知道分号是用作断句(EOS,end of statement)的,而且必须加分号,否则编译就不通过了.但JavaScript由于存在ASI机制,因此允许我们省略分号.ASI机制不是说在解析过程中解析器自动把分号添加到代码中,而是说解析器除了分号还会以换行为基础按一定的规则作为断句的依据,从而保证解析的正确性. 规范理论 es5 标准定义了自动分号插入规则,包括以下三个基本规则加两个前置条件: 前置条件 1.如果插入分号后解析结果是空语句,那么不会自动插入分号

javascript 分号总结及详细介绍

javascript每条语句都是以分号结束,但由于javascript具有分号自动插入规则,所有不同的编程人员有不同的习惯,有的加分号,有的不加分号,那么到底加分号好还是不加分号好?本文章向大家探讨javascript每条语句该不该加分号. javascript的分号代表语句的结束符,但由于javascript具有分号自动插入规则,所以它是一个十分容易让人模糊的东西,在一般情况下,一个换行就会产生一个分号,但实际情况却不然,也就是说在javascript中换行可能产生分号,也可能不产生,是否自动

JavaScript中的分号插入机制详细介绍

仅在}之前.一个或多个换行之后和程序输入的结尾被插入 也就是说你只能在一行.一个代码块和一段程序结束的地方省略分号. 也就是说你可以写如下代码 复制代码 代码如下: function square(x) {     var n = +x     return n * n } 但是却不可以写的像下面代码一样,这样就报错了哦 复制代码 代码如下: function area(r) {    r = +r    return Math.PI*r*r }//error 仅在随后的输入标记不能解析时插入

JavaScript的基本类型值-String类型

大致介绍 String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串.在JavaScript中没有单个的字符型,都是字符串.字符型就相当于只包含一个字符的字符串. 引号 字符串可以由双引号("")或单引号('')表示,但是要注意,如果是双引号开始就要以双引号结束,单双引号是可以嵌套的 "hello"; //正确         'hello'; //正确         'hello"; //错误         "hel

JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题

在自己做东西时,遇见了一个问题.就拿博客园的首页右边的搜索举例吧,用控制台操作. 现在我需要从另外一个地方将数据传给input,让其在一刷新的时候就显示数据. 这不难啊,于是我按照我的理解做了 代码如下: 此时,id为zzk_q的值应该为  测试  ,即input框内应该显示 测试 .但结果.. 咦,为什么没有变呢,不对啊,又来来回回变着法子试一下,还是不行,当然代码基本还是那样子的.突然想起我以前遇见过这样子的问题,仔细回想当时解决的方法(看样子当时没理解透,只是找到方法就过去了),想起来了,

JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】

本文实例讲述了JavaScript引用类型之基本包装类型.分享给大家供大家参考,具体如下: 为了操作基本类型值,ECDMAScript提供了3个特殊的引用类型--基本包装类型Boolean.Number和String.每当读取一个基本类型值时,后台会创建一个对应的基本包装类型的对象. var str = "Hello world"; var substr = str.substring(); 等价于 var str = new String("Hello world"

跟我学习javascript的基本类型和引用类型

一.基本类型和引用类型 基本的数据类型有5个:undefined,boolean,number,string,null typeof null; //"object" typeof undefined; //"undefined" typeof 1; //"number" typeof false //"boolean" typeof "1" //"string" (令人困惑的是,对nu

javascript中基本类型和引用类型的区别分析

基本类型和引用类型 ECMAScript包含两个不同类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段:引用类型值指由多个值构成的对象.当我们把变量赋值给一个变量时,解析器首先要做的就是确认这个值是基本类型值还是引用类型值. 常见的五种基本数据类型是: Undifined.Null.Boolean.Number和String.这五种基本数据类型可以直接操作保存在变量中的实际值. 看下面例子: var a = 10; var b = a; b = 20; console.log(a);

基于javascript中的typeof和类型判断(详解)

typeof ECMAScript 有 5 种原始类型(primitive type),即 Undefined.Null.Boolean.Number 和 String.我们都知道可以使用typeof运算符求得一个变量的类型,但是对引用类型变量却只会返回object,也就是说typeof只能正确识别基本类型值变量. var a = "abc"; console.log(typeof a); // "string" var b = 123; console.log(t

Javascript基础回顾之(一) 类型

本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者那里的一知半解,所以决定先花一些时间整理一下这些基础知识和大家分享. 刚开始是打算写一篇的,但是后来写着写着就发现越来越多,所以决定还是写一个系列吧.本系列所有内容都是涉及Javascript基础的,没有时髦的玩意儿,但是我相信这些基础的东西会有助于你理解那些有趣的东西的. Javascript基础

Javascript核心读书有感之类型、值和变量

计算机程序的运行需要对值(value)比如数字3.14或者文本"hello world"进行操作,在编程语言中,能够表示并操作的值的类型叫做数据类型(type),编程语言最基本的特性就是主持多种数据类型.当程序需要将值保持起来以备将来使用时,便将其赋值给(将值"保存"到)一个变量(variable).变量是一个值的符号名称,可以通过名称获得对值的引用.变量的工作机制是编程语言的令一个基本特性.本章将参照上节帮助理解本章内容,后续将更深入的讲解. javascript

javascript类型系统_正则表达式RegExp类型详解

前面的话 前面已经介绍过javascript中正则表达式的基础语法.javascript的RegExp类表示正则表达式,String和RegExp都定义了方法,使用正则表达式可以进行强大的模式匹配和文本检索与替换.本文将介绍正则表达式的RegExp对象,以及正则表达式涉及 到的属性和方法 对象 javascript中的正则表达式用RegExp对象表示,有两种写法:一种是字面量写法:另一种是构造函数写法 Perl写法 正则表达式字面量写法,又叫Perl写法,因为javascript的正则表达式特性