You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
(function(window,undefined){functiontest(options){log('testing!')(options.list||[]).forEach(function(i){})options.value.test('long string to pass here','and another long string to pass')return{foo: function(){}}}window.test=test})(window)(function(window){window.someLibrary={}})(window)
下面是解析器插入分号后的结果。
(function(window,undefined){functiontest(options){// 没有插入分号,两行被合并为一行log('testing!')(options.list||[]).forEach(function(i){});// <- 插入分号options.value.test('long string to pass here','and another long string to pass');// <- 插入分号return;// <- 插入分号, 改变了 return 表达式的行为{// 作为一个代码段处理foo: function(){}};// <- 插入分号}window.test=test;// <- 插入分号// 两行又被合并了})(window)(function(window){window.someLibrary={};// <- 插入分号})(window);//<- 插入分号
1. ECMAScript 运算符优先级
delete
new
typeof
void
instanceof
2. ECMAScript 一元运算符(+、-)
一元运算符只有一个参数,即要操作的对象或值。它们是 ECMAScript 中最简单的运算符。
delete
,void
,--
,++
在W3school里有详细讲解。其中涉及到几个ECMAScript定义的抽象操作,ToNumber(x),ToPrimitive(x)等等 下一章详细解答,下面出现的抽象定义也同理,先不管这个,有基础想深入了解可以提前熟读ECMAScript5规范(点击查看)。
一元加法对数字无作用,但会把字符串转换成数字。
与一元加法运算符相似,一元减法运算符也会把字符串转换成近似的数字,此外还会对该值求负
3. ECMAScript 加法运算符(+)
在多数程序设计语言中,加性运算符(即加号或减号)通常是最简单的数学运算符。
在 ECMAScript 中,加性运算符有大量的特殊行为。
ES5规范:
第七条,运算数中至少有一个为字符串,则将运算数转为字符串,结果为两个字符串相加。这就是为什么1 + '1' = '11'而不是2的原因。
在处理特殊值时,ECMAScript 中的加法也有一些特殊行为:
4. ECMAScript 减法运算符(-)
减、乘和除没有加法特殊,都是一个性质,这里我们就单独解读减法运算符(-)
与加法运算符一样,在处理特殊值时,减法运算符也有一些特殊行为:
某个运算数是 NaN,那么结果为 NaN。
注释:如果运算数都是数字,那么执行常规的减法运算,并返回结果。
5. ECMAScript 前自增运算符(++)
直接从 C(和 Java)借用的两个运算符是前增量运算符和前减量运算符。
所谓前增量运算符,就是数值上加 1,形式是在变量前放两个加号(++):
第二行代码把 iNum 增加到了 11,它实质上等价于:
6. ECMAScript 自动分号(;)插入
尽管 JavaScript 有 C 的代码风格,但是它不强制要求在代码中使用分号,实际上可以省略它们。
JavaScript 不是一个没有分号的语言,恰恰相反,它需要分号来就解析源代码。 因此 JavaScript 解析器在遇到由于缺少分号导致的解析错误时,会自动在源代码中插入分号。
6.1 例子
自动插入分号,解析器重新解析。
6.2 工作原理
下面的代码没有分号,因此解析器需要自己判断需要在哪些地方插入分号。
下面是解析器插入分号后的结果。
解析器显著改变了上面代码的行为,在另外一些情况下也会做出错误的处理。
6.3 ECMAScript对自动分号插入的规则
查看7.9章节,看看其中插入分号的机制和原理,清楚以后就可以尽量少踩坑。
看着头晕,看看具体的总结说明, 化抽象为具体 。
首先这些规则是基于两点:
6.3.1 ASI的规则
a. 新行并入当前行将构成非法语句,自动插入分号。
b. 在continue,return,break,throw后自动插入分号
c. ++、--后缀表达式作为新行的开始,在行首自动插入分号
d. 代码块的最后一个语句会自动插入分号
6.3.2 No ASI的规则
a. 新行以 ( 开始
b. 新行以 [ 开始
c. 新行以 / 开始
d. 新行以 + 、 - 、 % 和 * 开始
e. 新行以 , 或 . 开始
到这里我们已经对ASI的规则有一定的了解了,另外还有一样有趣的事情,就是“空语句”。
6.4 结论
提倡将花括号和相应的表达式放在一行, 对于只有一行代码的 if 或者 else 表达式,也不应该省略花括号。 这些良好的编程习惯不仅可以提到代码的一致性,而且可以防止解析器改变代码行为的错误处理。
关于JavaScript 语句后应该加分号么?(点我查看)我们可以看看知乎上大牛们对着个问题的看法。
原文参见:从++[[]][+[]]+[+[]]==10?深入浅出弱类型JS的隐式转换
The text was updated successfully, but these errors were encountered: