首页
学习
活动
专区
圈层
工具
发布

JS的分号可以省掉吗?

摘要: JavaScript语言从设计之初就是考虑带分号的,使用不带分号的编码规则就要小心点啦。...这么简单的代码为什么会出错呢?第一反应就是JS引擎将代码生成语法树的时候,可能解析不正确。于是,我在第一行末尾加分号测试。...在网络上搜索JavaScript关于分号的BUG,发现有非常多关于要不要使用分号的讨论。...大宗师Douglas Crockford表示要正确使用分号 引用minhan在扯不完的 JS 分号问题文中的论述: JSON、JSLint、JSMin和ADSafe 的创造者、ECMA JavaScript...如果你不想用分号,又怕出问题,v2ex上有位童鞋给出了一个速记方案: 如果你写 JS 代码不喜欢带分号,而又搞不清什么时候必须加分号,可以这么做:在以 "("、"[" 、"/"、"+"、"-" 开头的语句前面都加上一个分号

10.6K60

JS魔法堂:ASI(自动分号插入机制)和前置分号

的,而且必须加分号,否则编译就不通过了。...ASI机制不是说在解析过程中解析器自动把分号添加到代码中,而是说解析器除了分号还会以换行为基础按一定的规则作为断句的依据,从而保证解析的正确性。    首先这些规则是基于两点: 1....那既然存在ASI机制,那为什么还有那么多团队的代码规范中还规定必须写分号呢?不外乎三个原因:1. 因为存在No ASI的情况,懒得记忆这些特例;2....对于省略分号后代码压缩工具会出问题,jslint会对无分号的代码报warning等问题,贺师俊已经在回复中对其进行详细说明了。... .,*% 作为语句开头,因此只需记住前面5个即可,你看能懒则懒哦)  然后就是通过合理的缩进和空白行来使代码结构更为清晰(coffeescript不就是这样的吗?!)

2.3K80
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JS该写分号嘛? - wuuconixs blog

    ASI 在写JS之前,我一直在写Python,习惯了没有分号的代码。 刚好,JS为我们提供了 自动分号插入 Automatic Semicolon Insertion!...这让我们在大部分情况下都不用写分号,非常的优雅。 然而ASI在某些情况下将产生错误。 ASI发生错误的情况 IIFE 立即调用函数表达式 考虑以下代码。...> node 1.js a: 4 b: 3 c: 3 d: 4 js把中间的两个swap看成了 [a, b] = [b, a][c, d] = [d, c] 仍然是一个连等,我们需要从右往左看,首先是...这种没有报错的隐式错误,真在Leetcode刷题的时候 够你Debug半天了2333。 总结 实际上,完全不用为了ASI在一些情况下导致错误而每行都加上一个分号。...对于我目前遇到的这两种情况,可以总结一下,如果一行的开始是一个(或者[,那么再上一行你需要手动加上一个分号,至于其他的情况,完全不用考虑分号~ 还可以参考一下尤大的这篇回答 https://www.zhihu.com

    2.2K20

    node.js要不要加分号

    一开始,关于在node.js句末不加分号,我是拒绝的。因为有时不加分号会报错。 我觉得node.js在语法层面挺拧巴的,要么就像PHP那样严格要求加分号,要么就像python一律不加分号。...而node.js却表现出一副欲拒还迎的姿态,让人感觉就是既要拥抱变化,又要抱残守缺。 ?...加不加分号,这是一个问题 直到有一天我了解了加不加分号的场景,才终于释然 一言以蔽之:当代码是以 ( [ ` 这些符号开头时,就需要在代码之前加上分号,其他场景都不需要加分号 let msg =...:191:16) at bootstrap_node.js:612:3 正确的写法: let msg = '加不加分号呢' ;(function () { console.log('我是一个匿名函数...宇宙中究竟有多少个文明?

    2.5K20

    JS中Object的keys是无序的吗

    来自 「蔡昕萌」 同学的内部分享。 在最开始学习 JavaScript 时,我一直被灌输 Object 中的 Key 是无序的,不可靠的,而与之相对的是 Map 实例会维护键值对的插入顺序。...「But,Object 的键值对真的是无序的吗?」实际上在 ES2015 以后,Object.keys 的规则变了: 在一些现代的浏览器中,keys 输出顺序是可以预测的!...总结来说,就是当前的 key 如果是自然数就按照自然数的大小进行升序排序。...1000"] console.log(Object.getOwnPropertyNames(objWithIndices)); // ["1", "23", "1000"] 包括在 for-in 循环的遍历中...String 的加入时间排序,然后按照 Symbol 的时间顺序进行排序,也就是说他们会先按照上述的分类进行拆分,先按照自然数、非自然数、Symbol 的顺序进行排序,然后根据上述三种类型下内部的顺序进行排序

    5.5K21

    MATLAB中分号的神奇作用详解

    矩阵操作中的分号妙用在矩阵定义中,分号还有另一个重要作用:分隔矩阵的行。matlab% 创建一个3x3矩阵matrix = [1 2 3; 4 5 6; 7 8 9]这里的分号把矩阵分成了三行。...函数调用中的微妙之处在函数调用时,分号的作用依然是抑制输出,但这里有个有趣的现象:matlabplot(x, y); % 画图函数通常加分号disp('Hello'); % 显示函数也经常加分号为什么...脚本文件vs函数文件在脚本文件(.m文件)中,分号的作用和在命令窗口中一样。但在函数文件中,即使不加分号,中间变量也不会自动显示到命令窗口(除非你用disp或fprintf显式输出)。3....性能考虑你可能会好奇:加分号会影响程序运行速度吗?答案是:几乎不会!分号只是告诉MATLAB要不要显示结果,计算过程完全一样。...:在定义矩阵时正确使用分号分隔行函数调用看情况:对于主要目的不是返回值的函数,建议加分号小结分号在MATLAB中虽然看起来不起眼,但掌握它的使用方法对写出整洁、高效的代码至关重要。

    68110

    解构赋值的危险性是什么?js不加分号竟然会导致报错

    js不加分号竟然会导致报错 在使用ES6新特性的时候,有时候会出现一些奇怪的bug,明明代码写得很基础,一眼就能看懂正在做什么,但是结果却往往事与愿违,出现一些完全无法理解的特殊情况,不管是多少次反复检查...JS 解释器在解析时,会尝试自动补充分号,但它有一些固定规则:行首如果是 [ 或 (,解释器会优先认为它和上一行是同一条语句,所以 [a, b] = ......这个本质上是设计不兼容导致的,ASI 在早期 JS 里是“容错机制”,帮人少打几个 “ ;” ,但在 ES6 之后,JS 语法更复杂(解构、箭头函数、async/await),ASI 就经常和直觉冲突。...四、拓展:JS 中必须小心分号的场景 说来惭愧,这其实不是我第一次被 ASI“坑”了。...,后面如果直接换行,JS 会自动插入分号,导致返回值丢失。

    32610

    JavaScript里的分号,你加还是不加?

    在JavaScript中,如果语句各自独占一行,通常可以省略语句之间的分号(程序的结尾或者右“}”之前的分号也可以省略。)...因此,在编写JavaScript程序时,一般会有两种编码习惯,加分号 和 不加分号 : 加分号: 许多程序员使用分号来明确标记语句的结束,即使在并不完全需要分号的时候也是如此; 不加分号: 另一种风格是...,在任何可以省略分号的地方,都将其省略,只有在不得不用的时候才使用分号。...2.什么情况下可以不加分号 不加分号的情况下,JavaScript在解析时会自动插入分号,在满足以下两个条件的情况下,JavaScript会自动插入分号,可以不加分号: 2.1每条语句各占一行 如果多条语句中每条语句各占一行...; 加上分号在某些情况下可以增进代码的性能,因为这样解析器就不用花多余的时间去推测在哪里添加分号了。

    2.9K11

    你知道 JS 中的模块导入有一个缺点吗?

    作者:Dmitri Pavlutin 译者:前端小智 来源:Dmitri Pavlutin 1.命名导入和自动完成 假设我信编写了一个简单的JavaScript模块: // stringUtils.js...看起来没啥问题,挺好的。 现在在 app.js 文件中导入函数 exequalsIgnoreCase / app.js import { equalsIgnoreCase } from '....在此步骤中,IDE无法提供有关要导入的可用名称的任何建议。 然后,继续写入 from './stringUtils',然后移回大括号并展开自动完成以选择要导入的名称。...2.Python 中的模块 现在让我们尝试在 Python 中导入命名组件。它有同样的问题吗?...3.解决方法 我能找到的在JavaScript中对命名导入启用自动完成的唯一解决方案是调用IDE以获得帮助。

    2.6K10

    js中的Hook

    简单理解:   hook(钩子)就是: 把将要执行的的函数或者一系列动作注册到一个统一的接口下面, 当应用程序调用此接口(即hook)时,就等于调用了这一系列动作。...JS中的钩子(hook)的例子 JS中的钩子(hook)的例子1: 例如我们在向后台进行ajax请求的时候,后台经常会返回我们一些常见的错误码,如:001代表用户不存在,002代表用户密码输入错误。...这个时候我们要将错误友好的提示给用户。这个时候我们该怎样实现呢?...一般的写法可能是: $.ajax(option,function(result){ var errCode = result.errCode ;//错误码 if(errCode){...switch case来实现,但是这个两种写法都无法避免一个问题就是如果我的错误码特别多,那得写多少个if else和case 啊?

    8.1K31

    JS逆向 | 练手吗?头秃的那种。

    先打上断点,重新登录一下,成功进入断点说明位置十有八九是找到了,F11进去看看里面的加密逻辑是什么样的。 ? 看上去逻辑还蛮简单的,就是先这样再那样然后拼接在一起返回回来,完事儿~ ?...u,d,a,e,s这几个加密都可以通过上图的方法追踪到对应的加密。 这里我们主要研究f与m的加密逻辑。 先看看f的加密逻辑: 1var f = d.length ?...这里的e是初始化加密算法,我们再跟进去看看: ? ? 看到这里我已经不怎么想扣代码了,这么多乱七八糟的什么东西,要是真抠出来估计头发要掉一半。 ?...而且这个代码看着也不像自写的算法,估计也是套的通用的那几种算法,所以我开始翻之前扣过的代码,果然让我找到了: ?...上面的代码是不是长得有点像,为了验证这个想法我把js里关于加密的代码扣下来look look ? 不得不说好的编辑器可以让你事半功倍,看到图中划线的地方这个参数的加密方法就一目了然了。

    1.1K20

    前端JS发起的请求能暂停吗?

    在讨论前端JS发起的请求是否能暂停时,需要明确两个概念:什么状态可以被认为是“暂停”?以及什么是JS发起的请求? 如何定义暂停? 暂停指的是临时停止一个已经开始但尚未完成的过程。...TCP协议的数据传输是面向流的,数据被视为连续的字节流。客户端发送的数据将被分成多个独立传输的TCP段。无法直接控制每个TCP段的传输,因此无法实现暂停请求或响应的功能。...如果请求指的是网络模型中的传输,那么自然是不可能暂停的。 考虑到使用场景——由JS发起的请求。因此,可以认为这里的问题指的是在JS运行时发起的XMLHttpRequest或fetch请求。...然而,单个请求并没有这样的环境。 使用JS实现“假暂停”机制 虽然我们无法真正实现暂停请求,但我们可以模拟一个假暂停功能。在前端业务场景中,数据在接收到后不会立即显示在客户端。...在代码中,使用 Promise.all 将控制器 Promise 绑定。如果控制器处于暂停状态, Promise.all 不会被释放。

    1.2K10

    Js中的this总结

    这段代码可以在不同的上下文对象( me 和 you )中重复使用函数 identify() 和 speak() ,如果我们不适用this的话,那就需要identity和speak显示传入一个上下文对象,...没关系,我们只要知道在 ECMAScript 规范中还有一种只存在于规范中的类型,它们的作用是用来描述语言底层行为逻辑。...它们是为了更好地描述语言的底层行为逻辑才存在的,但并不存在于实际的 js 代码中。...可以按照下面的顺序来进行判断:函数是否在 new 中调用( new 绑定)?如果是的话 this 绑定的是新创建的对象。...如果是的话, this 绑定的是指定的对象。var bar = foo.call(obj2)函数是否在某个上下文对象中调用(隐式绑定)?如果是的话, this 绑定的是那个上下文对象。

    3.8K30
    领券