javascript对标点的要求,有时候少一个分号 ; 就不行,有时候没加引号 “” ,又不行,那么到底这些标点如何判断加不加?有没有要遵循的基本原则?
JS 又不像 Python 用缩进来控制代码逻辑,JS 对于没有 ; 的代码会依次向后遍历直到语句通顺为止,
var
a
=
3
而且还不能造成歧义,
听说过不加 ; 的,还没听说过不加 ""的,引号是必须要的吧,求题主普及不加引号的。
新手怕出问题,建议还是手动加引号吧。
如果你真的说的是很基础很基础的的意思,那我只能说多看多写,我刚接触编程的时候,觉得;就代表了一行代码的结束,所以当时恨不得每一行都来个;作为结束。举个例子,for(...){...}这个后面就没有;,再比如,if(){}后面也没有;,到现在我也不知道为什么这些后面没有;,但我觉得记住是这样写的就行了。至于“”,很好奇你说的不加“”就不行的例子,举个例子?
js 中可以不加分号,但是推荐加。
分号是添加在一条语句 statement
的末尾的,基本和java,c等语言的要求类似。
注意,ECMA
规定, function
声明不是一条语句,所以我们一般不在它的结尾加分号。
function foo() {
// ...
}
但如果把一个函数赋值给一个变量,它又算是一个赋值语句,所以应该加分号。
var bar = function () {
// ...
};
当然实际中没必要这么学院派,因为它并不影响程序运行,可加可不加,完全按照团队的代码规范来决定--如果有的话。
当然如果你要声明一个字符串才加引号啊。单引号双引号都可以。但是一般推荐单引号。
PS 注意编程的时候切换你的输入法,分号得是英文输入法下的半角符号。;
和;
不是一个字符,解释执行的时候会报错的...
分号书写的时候可有可无,因为解析器执行代码的时候会自动加上,至于引号,引号是引号声明字符串字面量的var s="this is a string";
题主有见过这样声明字符串字面量的吗?
var s = this is a string;
这样解析器会吧s的值当成一个变量执行(例子中的变量名还是错误的)
分号:不加分号的在部分情况是可以的,具体是在于上下是浏览器默认能分得开是两块,否则浏览器解析的时候会将上下合成一个语句而导致报错,但如果不加分号进行js压缩的话,则会报错。
引号:不加引号的情况暂时没见过,不知道楼主说的是不是变量定义的时候,一般加上引号是字符串,但因为js是弱语言,不定义问题也不大,自己会根据不同情况进行转换,但这个还真很少情况能不加...
看到大家回应分号(;)问题觉得有趣,个人是"不用分号作语句结尾流派",也回一下提供另种参考。
先说明我并没有要大家都来不加分号,而是回答这个问题"为什么可以不加分号",或者是问"为何分号是选项可有可无?",或是"不加分号是在何时可以不加?何时又一定要加?何时又算多加了?"
"不用分号作语句结尾流派"并不是"完全不使用分号流派",而是该加的时候加,不该加的时候不加,大部份时候不用分号作为语句结尾。我如果在改写别人的旧代码或是像原本函式库(如jquery)的风格是有用分号(;)时,也是会加的,基本上自己写的就不用分号(;)结尾。
分号(;)是个议题,正反方都有。但这也不是标新立异、节省空间偷懒少打字,是有一些理由的,能真的这样灵活用,代表你真的理解在这是在作什么。下面说明有太多细节,有错请再提示提示。
分号(;)在其他语言就不说了,这里纯讨论js,在js里的分号(;)是什么作用?它既是语句(表达式)的分隔,也可以作为语句的结尾。纯粹认为分号(;)就一定是语句的结尾是有疑问的,下面这两个例子就是典型范例,也是很常见的错误:
//有问题的例子
function add() {
var a = 1, b = 2;
return
a + b;
}
或是像下面这个,也是很常见的错误示范:
//有问题的例子
function test() {
return
{
test: true
};
}
这两例的函数回传值必为undefined
,而不是应该回传的值3与物件。为何?因为你有看到return先换行,再接著要回传的值了吗?也就是说这两个代码在执行时,相当于下面这样的代码(我只写一个出来,另一例相同):
function test() {
return;
{ test: true };
}
return
因为先换行,视为语句结尾,所以根本没有可回传的值,也就是在上例子中,回车(\n)先把return
结尾掉了,后面你加的分号(;)是结尾到下一行的。这逻辑代表回车(\n)在这一句语句结尾这功用上,比分号(;)还优先。
回车(\n)或空一行,为什么可以作为语句的结尾,来源是由于ECMAScript的自动插入分号(Automatic Semicolon Insertion)的标准。不过这标准是有特例的,在以下的4种情况是用回车(\n)或空一行是不会作自动插入分号来让语句作结尾,讲是说"特例",但大概也是每天都用到,只是常不知道为何是这样而已。大致说明如下:
(注: 遇到等号(=)算未完整表述式如果指定值在下一行会略过自动结尾作用)
这种例子很常见,通常是在分开内容太长的语句,或是让值写得清楚的地方。我举下面的两个合法语法范例,你会很容易理解回车(\n)会在何时自动结尾,虽然这些例子都不好阅读:
//第一例
var a =
[ 1,
2,
3,
]
//第二例
function test(a,
b,
c){
console.log(a,b,c
)
}
这规则满怪异,从来没看过有人这样写过。js会认为++与--在这一行是要准备来运算执行下一行的值,所以不结尾。下面合法范例:
a=1
--
a
console.log(a)
这简写语法常见,每天都会用到。
if(null==undefined)
console.log(true)
else
console.log(false)
function test(){
return 1
+2
-3
}
console.log(test())
下面这个例子刚好与第一点颠倒
var a =
[1
,2
,]
以上为用回车(n)作为自动插入分号(;)的4个特例。其他都会自动帮你作结尾。所以依这个逻辑,为何上面的return
多了一行就会产生错误,另外与return
有同样情况的还有几个,像continue
、break
、throw
,先回车然后在下一行再加分号也会已经自动插入分号。
//错误例子,不论if这行与else这行间有没有空一行都不会自动结尾
var i = 10
if (i === 5)
else console.log(false)
你可以加上分号在if这行,会让语法合法可执行。个人有见过但相当少数。
//合法例子,但没人这样用的
var i = 10
if (i === 5);
else console.log(false)
分号(;)的用处不是只有语句结尾,它在某些语法有分隔表述式或语句的功用。以下情况必用分号(;),无论什么流派。
for(var i=0 ; i<10 ; i++)
{
//...
}
//第一例
var i = 0; i++
//第二例
case 'foo': doSomething(); break
[
或(
开头的行,前面需要加分号(;)。这十分特别,这是一种保护防范的语法,有时候解译器或压缩工具会误认为开头()
是要作函数呼叫或阵列或[]
物件存取属性。另一情况是IIFE会认为是同一语句,IIFE刚好也是用(
开头,所以这两种必加分号(;)在前面。参考: http://stackoverflow.com/ques...
//第一例
;(x || y).doSomething()
;[a, b, c].forEach(doSomething)
//第二例
var x = 42
;(function () { })()
接著要理解,什么时候必"不需要"与"一定不能"使用分号(;),这也很容易理解的。如果你是都要用分号来作每行语句的结尾,你应该了解一下。
for
语句的最后一个(第三个)表达式后面。画蛇添足不多说。//错误语法
for (var i=0; i < 10; i++;){}
//不建议语法
function a(){};
if(){};
//正确语法,赋值时使用
var obj = {a:1};
var fun = function(){};
//正确语法,do...while
do {...} while (...);
//错误例子,不过它合法
if (0 === 1); { alert("hi") }
//上例相当于下面这样
if (0 === 1);
alert("hi");
要不要用分号(;)作为语句的结尾,就看个人习惯或组织团队规定的撰写风格了。不管如何,你应该理解为何分号(;)是选项而非必要的原因,不要因为大神说要加该加,就埋头拼命加,而不去理解为何要加。真实情况是并不是所有的情况分号作为语句都是选项,是有规则标准的。js程式语言虽然常常有坑与例外,但本质上是死的东西,上面的规则学好足以应付9成情况。
题外话是,开源专案中真的完全不使用分号(;)的专案虽不常见,最有名的是大家每天都在用的npm
,还有最近比较火红的redux
。
最后1个小例子是请问下面这个合法的代码,它是相当于x;++y;
还是x++;y;
?三秒内说得出来代表你有认真看这篇回答。
x
++
y
内容很多参考下面这两则文章来的,里面对js大神有批评的,不喜勿看:
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
6 回答2.3k 阅读
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
记住以([/+-这五个字符开头的要加分号一般就够了。其它还有.,*%开头也要加分号,但是下面四个一般不会在开头,所以记住上面五个就一劳永逸了。如果想探究原理,可以看标准,里面有一节专门写了asi自动分号插入机制。
熬,还有引号,字符串加引号,标致符,保留字什么的不加。其它暂时没想起来!