深圳市博士通科技有限公司

js中的分号

2020/11/12 12:16:23   阅读:2602    发布者:2602
js中语句末尾可以不加分号,

很多时候在做练习或写几个页面时,我都是不会加的。虽然知道加了会好一点。但就是觉得很敲一句就要多按一次分号键(;)来加分号,而不加也不怎么样,然后就不想加了。

也听说在对js压缩于,会自动给语句加分号。很多插件的js的首句前面都会有个;分号,是用来避免当如果合并如下js文件如以下情况时,解释器可能会出错。

//代码块A

var a = 10;
var b = 5;

var c = a + b

//代码块B

('x' + 'y').toString()
 报错; 在('x' + 'y').toString() 前面加上分号就好了。所以,分号是一件多么重要的事情。



var x = 'javascript'; //javascript
x = "hello"; // hello
x = 555; //555
x = null; //null
x = a; //a is not defined
x = true; //true
对于数字是直接赋值的,因为它没有多样性,数字就是数字。但是对于值是英文的情况就很难区分了,因为在编程语言中,英文既可能是字符串,也可能是引用的另外一个变量。因此如何区分变量和字符串就显得格外重要,编程语言常常将字符串用引号括起来,从而达到区分变量和字符串的作用。有些语言比如java,它们还区分单引号和双引号,单引号括起来的是一个字符,而双引号括起来的才是字符串。但javascript并不区分字符和字符串,而是把它们都当作字符串,因此在javascript中单引号和双引号并没有什么区别。

虽然通过引号可以用来区分变量和字符串,但值往往也可能是一个关键字,比如上面那段代码我将x赋值为null,那么这些编程语言又是如何区分变量和关键字的呢?
null = 123;
console.log(null); //Uncaught ReferenceError: Invalid left-hand side in assignment
undefined = 456;
console.log(undefined); //undefined
以上我给null和undefined分别赋给了另外一个值,其结果,给null赋值报错了,给undefined赋值虽然没有报错,但也没有成功。也许对于null和undefined来说,它们就是值。而变量则是寻找值。我们说javascript是如何区分变量和关键字,最终或许就变成了javascript是如何区分变量和值的。
在一些JS插件中,经常会看到类似下面这样的一行代码

;(function(){
 .........
})();
在代码的最前面有一个分号,那么这个分号是干什么用的呢?

我们知道一个分号代表了一段代码的结束,但问题是javascript允许你不写分号,这样就出现了一个问题,代码的结束与否不是你来决定的而是由程序来决定的,而程序也不是万能的,往往它只是走的某个规则,而如果你写的这段代码和它的规则不符,最终的结果就有些不如人意了。

以下是javascript对省略分号的解析规则

var a
=
1 + 2
console.log(a) //3
javascript解析器会将以上代码解析成

var a = 1 + 2;
console.log(a); //3
如果javascript不给2后面添加分号将会无法解析下去,也可以这么说,如果遇到无法解析下去则javascript解析器会尝试给其添加一个分号,如果还是解析不了则报错。又比如下面这一段代码

var a = 10;
var b = 5;

var c = a + b
(a + b).toString()

// b is not a function
它说b不是一个函数,也就是说以上这段代码很有可能解析成了下面这段代码

var a = 10;
var b = 5;

var c = a + b(a + b).toString();
它把()当成了函数调用。也可以理解为javascript解析器会尽可能多的去匹配,但也有几个例外,它们是retrun、break、continue,当javascript解析器解析到这几个关键字时,它不会把换行后的内容当成是自身的,而是直接在换行之前添加分号,不妨看看下面这段代码

function test(){
  return 
  123;
}

console.log(test()); //undefined
它并没有返回123,也就是说它直接在retrun后面加了分号。
因此不要把分号单单认为只是用来结束某段代码,它还可以用来隔离某段代码和别人划清界限。