首页 > 其他分享 >JS代码质量—ASI 的机制(自动插入分号)

JS代码质量—ASI 的机制(自动插入分号)

时间:2023-11-02 15:48:13浏览次数:27  
标签:return myResult JS 插入 const ASI

参考:https://zhuanlan.zhihu.com/p/394561311 

JS中有一些优雅换行(美化),可以让代码的可读性更强,但是需要注意 JS引擎自动插入分号的机制 会不会 出现非预期的情况。

ASI 规则

1. 遇到行结束符时,会插入一个分号。
    注意:也不说遇到 行结束符 一定插入分号。会分析和下一行语句是否有关联,如果有联系就不会插入分号,而是上下合在一起的语句(具体文档后面的意外问题)。

// 实际的源码
const myVar = 5
// ASI 之后
const myVar = 5;

2.遇到句法不允许的 ‘}’ 时插入一个分号。

{ 1
2 } 3

// ASI 后变成了

{ 1
;2 ;} 3;

3.遇到一个 restricted production 后跟行结束符时,自动插入一个分号。
   这些 restricted production 包括:++, --, continue, break, return, throw, yield 和 module 关键字。解析器遇到这些关键字后跟一个行结束符时,会在关键字后面插入一个分号。

// 实际的源码
for (let i = 0; i < 5; i++) {
  if (myCondition) {
    continue
  }
}
// ASI 后
for (let i = 0; i < 5; i++) {
  if (myCondition) {
    continue;
  }
}

但是需要注意 return 关键字:

return
a + b

// ASI 后变成了

return;
a + b;

上述代码会在 return 语句后面插入一个分号,它会返回 undefined。return 后面的语句无法被访问。为了避免这个问题,可以把上述2条语句写在同一行。

 

依赖 ASI 可能导致的意外问题

如果我们不在代码中写分号,而是依赖 ASI,会偶尔遇到语义完全改变的情况。

  • 意外的函数调用
    // 实际的源码
    const myResult = myVar1 + myVar2
    (myVar3 + myVar4).toString()
    // 期待的输出
    const myResult = myVar1 + myVar2;
    (myVar3 + myVar4).toString();
    // ASI 后实际的输出
    const myResult = myVar1 + myVar2(myVar3 + myVar4).toString()
  • 意外的属性访问
    // 实际的源码
    const myResult = myFunction()
    ['ul', 'ol'].map(x => x + 1)
    // 期望的输出
    const myResult = myFunction();
    ['ul', 'ol'].map(x => x + 1)
    // ASI 后实际的输出
    const myResult = myFunction()[("ul", "ol")].map(x => x + 1);

     

JS语句美化的写法:

  • 属性方法点的写法:JS对象链式写法如果太长,可以通过换行美化写法。
    obj
      .then()
      .then()

    这种情况可以放心写,不会因为 ASI机制 发生意外问题的。

  • 连续的多个逻辑判断:
    let obj2 = obj
        && obj.data
        && obj.data.name

    这种情况可以放心写,不会因为 ASI机制 发生意外问题的。

 

总结: 

  1. 常规写JS语句一般都不会出现什么意外的问题。ASI机制一般都会结合下一行的内容再确定 换行符要不要插入分号的;但是遇到有些标识符会直接在后面的换行符插入分号。
  2. 应该插入换行符而没有插入引起的意外问题。【因为结合下一行语句导致】
    // 实际的源码
    const myResult = myFunction()
    ['ul', 'ol'].map(x => x + 1)
    
    // ASI 后实际的输出
    const myResult = myFunction()[("ul", "ol")].map(x => x + 1);
  3. 不应该插入而插入了分号引起的意外问题。【碰到特殊标识符】
    return
    a + b
    
    // ASI 后变成了
    return;
    a + b;

     

 

标签:return,myResult,JS,插入,const,ASI
From: https://www.cnblogs.com/wfblog/p/17805358.html

相关文章

  • 前端歌谣的刷题之路-第六十八题-js动态创建节点
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • 无涯教程-H2数据库 - 插入数据(Insert)
    SQLINSERT语句用于将新的数据行添加到数据库中。Insert-语法以下是INSERTINTO语句的基本语法。INSERTINTOtableName{[(columnName[,...])]{VALUES{({DEFAULT|expression}[,...])}[,...]|[DIRECT][SORTED]select}}|{SET{columnNa......
  • js/javaScript实现金额千分位
    作为前端开发,我们都知道,在实际的需求开发中,难免会遇到需要将接口返回的金额进行千分位格式化的场景。千分位后的金额便于阅读,提升用户体验。金额千分位可以由前端来处理,也可以后端处理后返回给前端展示。下边就来贴一下前端的两种实现方式:方法一:constcheckNaN=(value,cb)=......
  • vue vue.config.js 配置
    1.开启sourceMap//显示sourceMap,便于调试 //process.env.NODE_ENV有的是dev/prod,有的是development/production,需要自己确认下productionSourceMap:process.env.NODE_ENV!=='production',......
  • js worker
         index.html<!DOCTYPEhtml><html><head><title>JavaScriptWorkerExample</title></head><body><script>//主线程constmainWorker=newWorker('worker.js');......
  • JS加密/解密之jsjiami在线js加密的效率问题
    故事背景 经常有客户反馈,v7加密的效率比v6低,但是安全性更好。这里我给大家科普一下关于jsjiami的优化诀窍。示例源代码//伪代码while(1){varname=‘张三’}优化后var_name='张三';while(1){varname=_name}优化原理相信很多朋友会疑惑这两者的区别是什......
  • python题目:把JSON字符串里面的数据进行替换【杭州多测师_王sir】
    name ,时间戳,value这三个值要变 "tags":[{"values":[{"value": 43.6525,"quality": 192,"timestamp": 00}],"name": "/system/Template_2/Instance_8/system/Property_10",“type”: 12}]} import randomimp......
  • .net json 处理
    处理较复杂的Json字符串,不需要对Json进行序列化操作,以下是一种非常简单的方法,记录以下;Json字符串如下:{ "code":0, "msg":"SUCCESS", "result":[{ "changesContent":[{ "unionNo":"1719708390162472960", "orderDel......
  • vuejs3.0 从入门到精通——基于 Vite 搭建 Vue3 项目
    基于Vite搭建Vue3项目 一、为什么选Vitehttps://www.vitejs.net/ 在浏览器支持ES模块之前,JavaScript并没有提供的原生机制让开发者以模块化的方式进行开发。这也正是我们对“打包”这个概念熟悉的原因:使用工具抓取、处理并将我们的源码模块串联成可以在浏览器中运......
  • 无法加载文件 E:\nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本。有关详
    npminstall报错解决办法打卡windospowershell并且以管理员运行输入命令set-executionpolicyremotesignedY......